2010-10-04 4 views
5

Ich versuche, eine C++ Member-Funktion mit einer älteren C-Bibliothek unter Verwendung eines Funktionszeigers Schnittstelle - Ich kann nicht sehen, warum dies mit Link-Fehler kommt, kann jemand sehen Warum ?Problem mit der Verknüpfung, C++ Member-Funktion zu C Callback

Verbindungsfehler

/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' 

kompilieren mit: g ++ callback.cpp -o Rückruf

#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; 
} 

Antwort

2

static Verify* vfy;

Sie benötigen diese statisches Element zu definieren, die Erklärung [, dass Sie zur Verfügung gestellt haben ] ist einfach nicht genug. Der Code wird den Linker nicht übergeben, da die Definition [des statischen Members] fehlt.

Definieren Sie vfy außerhalb der Klasse.

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

vielen Dank! – Stonky

+0

@Stonky: Wenn du mit meiner Antwort zufrieden bist, kannst du sie upvoten und akzeptieren, indem du auf das Häkchen [neben meiner Antwort] klickst ';)' –

+0

werde ich - ich kann es anscheinend nicht tun, wenn es noch 6 Minuten dauert. – Stonky

1

Sie haben nur Ihr statisches Element deklariert. Sie müssen es auch definieren. Fügen Sie in Ihrer .cpp/.cc-Datei die Definition hinzu.

Verify* VerifyWrapper::vfy;