2011-02-28 3 views
0

je tentais de compiler du code C++ dans Xcode et je suis arrivé cette erreur:Problème lors de la compilation du code C++ avec Xcode

Undefined symbols: 
    "Editorial::sm_nTotalEditorials", referenced from: 
     Editorial::AskTotal()  in editorial.o 
     Editorial::~Editorial()in editorial.o 
     Editorial::~Editorial()in editorial.o 

La liste suit avec deux entrées pour le destructor et quatre entrées pour le constructeur (qui je crois sont les seules fonctions dans lesquelles j'utilise sm_nTotalEditorials). J'attache la définition de la variable et les fonctions dans lesquelles je l'utilise.

class Editorial 
{ 
private: 
    static int   sm_nTotalEditorials; 
    ... 
} 

int Editorial::AskTotal() {return sm_nTotalEditorials;} 

Editorial::~Editorial() 
{ 
    if (!m_pPrev) sm_pFirstEditorial=m_pNext; 
    if (m_pPrev) (*m_pPrev).SetContext((*m_pPrev).AskPrev(),m_pNext); 
    if (m_pNext) (*m_pNext).SetContext(m_pPrev,(*m_pNext).AskNext()); 
    sm_nTotalEditorials--; 
} 

Ensuite, il imprime erreur similaire avec les 3 autres variables privées statiques que j'utilise. Je dois me tromper avec l'utilisation statique. C'est mon premier code C++, donc je m'excuse pour toute mauvaise syntaxe ou si la question est trop bête; J'ai essayé de chercher sur internet mais l'erreur imprimée par Xcode est assez ambiguë et selon les tutoriels que j'ai pu voir, j'utilise tout comme il se doit. De plus, le code est assez long pour tout imprimer, et j'ai collé les parties où je pense que l'erreur devrait être, mais encore une fois je ne suis pas sûr de cela non plus.

+0

quelle est la fin de votre code source? .m ou .cpp? – hol

+0

Je ne sais pas si cela aide. Mais je me souviens que j'ai essayé de compiler du code C et quand j'ai changé la fin de .c en .m, elle s'est soudainement compilée. Peut-être pas votre problème juste une pensée. – hol

Répondre

1

En C++, la création d'un membre de données statiques pour une classe est un processus en deux étapes. D'abord, vous devez déclarer la variable, ce que vous avez fait ici. Cependant, vous devez également le définir quelque part afin que le compilateur sache où placer l'espace de stockage de la variable. Généralement, cela est fait dans le fichier .cpp de la classe. Dans le fichier .cpp, essayez d'ajouter cette ligne:

int Editorial::sm_nTotalEditorials = 0; 

Cela donne au compilateur la définition dont il a besoin, et donc vous n'aurez pas plus d'erreurs de l'éditeur de liens se plaignent de la définition manquante. Vous voudrez probablement aussi le faire pour les autres membres de données statiques.

Notez que lorsque vous effectuez ces types de définitions, vous ne répétez pas le mot-clé static; cela donnerait le lien statique du champ statique, ce qui ne résoudrait pas le problème.

+0

Merci! Ça a marché! La chose étrange est que dans le tutoriel que je lisais (avec était vraiment bon dans l'ensemble ... sauf pour cela) il est dit explicitement que les variables statiques sont initialisées à 0 lorsque vous ne clarifiez rien d'autre ... – Nordico

+0

@ Nordico- this est vrai, mais c'est trompeur. Si vous définissez une variable statique et que vous la laissez non initialisée, la valeur par défaut est zéro, mais vous devez toujours la définir quelque part. C'est l'absence d'une définition qui causait votre problème. – templatetypedef

+0

Et comment pourrais-je fournir une définition complète sans initialiser la valeur? Serait-il juste "int Editorial :: sm_nTotalEditorials" suffire ou il y a un autre moyen? (désolé d'être ennuyeux, mais le tutoriel ne clarifie pas cette différence pour les variables statiques et je voudrais bien le comprendre) – Nordico

0

Compile-t-il en tant que code C++? Je me souviens d'avoir lu que le fichier aurait besoin d'une extension .mm pour le distinguer d'obj-c. Il y a aussi un type de fichier déroulant sur la page "Get Info" pour le fichier dans Xcode.

Questions connexes