Gọi hàm thành viên c ++ từ c

chỉ cần thực hiện cuộc gọi đơn giản như dưới đây. lớp abc{ thành viên_func1[]; . thành viên_func1[]{ //. this->member_func2[];// chỉ thực hiện cuộc gọi đơn giản //. }

Để hoàn thành cái đầu tiên, chúng ta sẽ cần một tài liệu tham khảo chung. Thực sự không có cách nào rõ ràng để cho C biết chính xác độ lớn của một đối tượng nhất định. Do đó, tài liệu tham khảo tốt nhất là một con trỏ tới lớp đó có thể được giữ và chuyển bởi mã C

Mã C với chức năng chính

1
2
3
4
5
6
7
8
9
10
11
12
#include 
#include "foo.h"

int main[const int argc, const char **argv]
{
   
   void *temp_foo = getFoo[5];

   printString[temp_foo];

   return[ EXIT_SUCCESS ];
}

Trong đoạn mã trên, bạn sẽ thấy rằng ở dòng 4, phương thức getFoo[5] trả về một con trỏ trống có tên là temp_foo. Đây là con trỏ tới lớp Foo của chúng ta mà chúng ta sẽ định nghĩa tiếp theo

Lớp Foo được định nghĩa trong tệp tiêu đề của chính nó. Điều này được thực hiện vì một số lý do, thứ nhất, nó giữ cho các chỉ thị của trình biên dịch trước đơn giản hơn và thứ hai, nó giúp đảm bảo các hàm truy cập cho C được xác định chính xác cho mọi hàm C++. Có khá nhiều thứ đang diễn ra ở đây, vì vậy hãy xem mã bên dưới và tất cả chúng ta sẽ giải thích

Tệp tiêu đề mục đích kép C ++ và C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * gotta use stdint so we can use the same type in C++/C
 * could make the example a bit more complicated with some
 * #defines to fix but it's simpler this way.
 */
#include 


#ifdef __cplusplus

#include 

class Foo
{
public:
   Foo[ int32_t a ];
   ~Foo[];
   std::string toString[];
private:
   int32_t k;
};

#endif

#ifdef __cplusplus
extern "C" 
{
#endif

void*  getFoo[ int32_t a ];
void   destroyFoo[ void *foo ];
void   printString[ void *foo ];

#ifdef __cplusplus
}
#endif

Điều đầu tiên bạn sẽ thấy khác thường là câu lệnh __cplusplus ifdef. Điều này được xác định nếu tiêu đề này đang được xử lý bởi trình biên dịch c ++. Nếu bạn làm theo mã đến cuối if statemetn đầu tiên ở dòng 15, bạn sẽ thấy nó chỉ bao gồm định nghĩa lớp. Đó là bởi vì các lớp không được công nhận trong C++.
Khi tiêu đề này được trình biên dịch C xử lý, phần khai báo của lớp Foo và tất cả các hàm của nó sẽ biến mất hoàn toàn. Điều tiếp theo bạn sẽ nhận thấy là dòng 17. Nó có cùng lệnh như dòng 4, tuy nhiên lần này chúng ta sử dụng nó để chèn dòng bên ngoài “C” xung quanh các hàm được khai báo trên các dòng 20,21,22 kết thúc bằng cùng một khai báo với dấu ngoặc nhọn ở dòng 24. Điều này đảm bảo rằng khi tệp tiêu đề này và phần triển khai của nó được biên dịch thành một tệp đối tượng mà chúng không bị xáo trộn, nghĩa là chúng có thể được nhận dạng bởi tệp đối tượng do trình biên dịch C tạo ra. Bây giờ, nếu chúng ta loại bỏ mọi thứ chỉ được biên dịch bằng trình biên dịch C++ [mọi thứ được bao quanh bởi __cplusplus], chúng ta sẽ thấy rằng thứ duy nhất sẽ được biên dịch bởi trình biên dịch C khi chúng ta đưa vào tiêu đề này là các hàm ở 20, 21 và .

Tôi đã đề cập đến các chức năng của trình truy cập khá nhiều. Các hàm truy cập là một cách để chuyển đổi tham chiếu mà chúng ta đã chuyển đến C [con trỏ void] trở lại thành thứ gì đó mà C++ có thể sử dụng được và thực hiện điều gì đó với nó. Chúng ta sẽ thấy nhiều hơn về điều này tiếp theo

Triển khai C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include 
#include 
#include 
#include 

#include "foo.h"

Foo::Foo[ int32_t a ]
{
   k = a 

Chủ Đề