2010-10-04 44 views
5

Tôi đang cố gắng giao diện chức năng thành viên C++ với thư viện C cũ lấy con trỏ hàm - Tôi không thể thấy lý do tại sao điều này xảy ra với lỗi liên kết. tại sao ?Sự cố với liên kết, hàm C++ thành viên để gọi lại C

lỗi liên kết

/tmp/ccl2HY1E.o: In function `VerifyWrapper::verifyGlue(int)': callback.cpp:(.text._ZN13VerifyWrapper10verifyGlueEi[VerifyWrapper::verifyGlue(int)]+0xe): undefined reference to `VerifyWrapper::vfy' 
/tmp/ccl2HY1E.o: In function `VerifyWrapper::set(Verify&)': callback.cpp:(.text._ZN13VerifyWrapper3setER6Verify[VerifyWrapper::set(Verify&)]+0xf): undefined reference to `VerifyWrapper::vfy' 

biên dịch với: g ++ callback.cpp -o callback

#include <iostream> 
using namespace std; 

class Verify 
{ 
public: 
    int verify(int i) { return i * 2; }; 
}; 


class VerifyWrapper 
{ 
public: 
    static int verifyGlue(int i) { return vfy->verify(i); }; 
    static void set(Verify& v) { vfy = &v;}; 
private: 
    static Verify* vfy; 
}; 


// legacy function 
int func(int i, int(*f)(int)) 
{ 
int ret = f(i); 
return ret; 
} 

int main(void) 
{ 
int i = 10; 
Verify v; 
VerifyWrapper::set(v); 
int ret = func(10, &VerifyWrapper::verifyGlue); 
cout << "result : " << ret << endl; 

return 0; 
} 

Trả lời

2

static Verify* vfy;

Bạn cần phải xác định thành viên này tĩnh, việc kê khai [mà bạn đã cung cấp ] là không đủ. Mã sẽ không vượt qua mối liên kết vì định nghĩa [của thành viên tĩnh] bị thiếu.

Xác định vfy bên ngoài lớp học.

Verify* VerifyWrapper::vfy; //definition 
+0

cảm ơn rất nhiều! – Stonky

+0

@Stonky: Nếu bạn hài lòng với câu trả lời của tôi, bạn có thể upvote nó và chấp nhận nó bằng cách nhấp vào dấu kiểm [bên cạnh câu trả lời của tôi] ';)' –

+0

tôi sẽ - apparantly tôi không thể làm nếu cho thêm 6 phút mặc dù. – Stonky

1

Bạn chỉ khai báo thành viên tĩnh của mình. Bạn cũng cần phải xác định nó. Trong tệp .cpp/.cc của bạn, hãy thêm định nghĩa.

Verify* VerifyWrapper::vfy; 
Các vấn đề liên quan