2015-12-15 1 views
0

est ici un simple ensemble de fichiers qui reproduisent le problème que je vais avoir:Appel de la méthode statique C++ de C donne les références non définies lors de la compilation

ch:

void dummy(); 

c.cpp:

#include <stdio.h> 
extern "C" { 
#include "c.h" 
} 

class Bubu { 
public: 
    static Bubu *getInstance() { 
    if (_instance == NULL) { 
     _instance = new Bubu; 
    } 
    return _instance; 
    } 

private: 
    static Bubu *_instance; 
}; 

Bubu *_instance = NULL; 

void dummy() { 
    printf("bubu called\n"); 
    Bubu *ptr = Bubu::getInstance(); 
} 

main.cpp:

extern "C" { 
#include "c.h" 
} 

int main() { 
    dummy(); 
    return 0; 
} 

Quand je compile je reçois ceci:

g++ -W -Wall -c c.cpp -o c.o 
c.cpp: In function ‘int bubu()’: 
c.cpp:24: warning: unused variable ‘ptr’ 
g++ -W -Wall main.cpp c.o -o main 
c.o: In function `Bubu::getInstance()': 
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x7): undefined reference to `Bubu::_instance' 
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x1d): undefined reference to `Bubu::_instance' 
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x24): undefined reference to `Bubu::_instance' 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 
Compilation exited abnormally with code 2 at Tue Dec 15 09:15:21 

J'ai vu la réponse à d'autres questions similaires mais le problème est soit un manque Bubu :: lorsque vous appelez la méthode statique ou de l'absence d'initialisation de l'organe statique extérieur la déclaration de classe ou la construction extern "C" manquante. Je suis à peu près certain que je ne fais pas ces erreurs ... Je fais définitivement d'autres choses. Pouvez-vous s'il vous plaît expliquer ce qui se passe?

+1

Je pense que cela a à voir avec le mangling de nom https://en.wikipedia.org/wiki/Name_mangling – dvhh

+1

'Bubu * Bubu :: _ instance'? –

+1

Et qu'en est-il de 'Bubu * Bubu :: _ instance = NULL;'? – LogicStuff

Répondre

3

Lorsque vous définissez une variable statique dans une classe, vous devez également la définir en dehors de la classe. Vous avez essayé de le faire, mais

Bubu *_instance = NULL; 

fera juste un pointeur global Bubu, instancier une statique à l'intérieur de la classe. Vous devez utiliser

Bubu *Bubu::_instance = NULL; 

pour indiquer au compilateur que ce sera la variable statique à l'intérieur de la classe.

+0

Merde, c'était l'initialisation après tout. Erreur d'amateur. Merci! – unkown