2010-10-04 14 views
5

Sto cercando di interfacciare una funzione membro C++ con una libreria C legacy che utilizza un puntatore a funzione - Non riesco a capire perché questo continua a generare errori di collegamento, Qualcuno può vedere perché ?Problema con il collegamento, funzione membro C++ a callback C

errori di collegamento

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

compilare con: g ++ -o callback.cpp 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; 
} 

risposta

2

static Verify* vfy;

È necessario definire questo membro statico, la dichiarazione [che avete fornito ] non è abbastanza. Il codice non passerà il linker perché manca la definizione [del membro statico].

Definire vfy fuori dalla classe.

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

grazie mille! – Stonky

+0

@Stonky: Se sei soddisfatto della mia risposta, puoi invitarla e accettarla facendo clic sul segno di spunta [accanto alla mia risposta] ';)' –

+0

lo farò - apparentemente non posso farlo se per altri 6 minuti. – Stonky

1

Hai dichiarato solo il membro statico. Devi anche definirlo. Nel file .cpp/.cc aggiungere la definizione.

Verify* VerifyWrapper::vfy; 
Problemi correlati