web-dev-qa-db-fra.com

erreur de liaison variable statique

J'écris du code C++ sur un Mac. Pourquoi est-ce que j'obtiens cette erreur lors de la compilation?:

Symboles non définis pour l'architecture i386: "Log :: theString", référencé à partir de: Log :: method (std :: string) dans libTest.a (Log.o) ld: symbole (s) introuvable (s) pour l'architecture i386 clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)

Je ne sais pas si mon code est incorrect ou je dois ajouter des drapeaux supplémentaires à Xcode. Mes configurations XCode actuelles sont celles par défaut pour un projet de "bibliothèque statique".

Mon code:

Log.h ------------

#include <iostream>
#include <string>

using namespace std;

class Log{
public:
    static void method(string arg);
private:
    static string theString ;
};

Log.cpp ----

#include "Log.h"
#include <ostream>

void Log::method(string arg){
    theString = "hola";
    cout   << theString << endl; 
}

J'appelle la 'méthode' à partir d'un code de test, de cette façon: 'Log :: method ("asd"):'

merci de votre aide.

63
subzero

Vous devez définir la statique dans le fichier cpp.

Log.cpp

#include "Log.h"
#include <ostream>

string Log::theString;  // <---- define static here

void Log::method(string arg){
    theString = "hola";
    cout   << theString << endl; 
}

Vous devez également supprimer using namespace std; de l'en-tête. Prenez l'habitude pendant que vous le pouvez. Cela polluera l'espace de noms global avec std partout où vous incluez l'en-tête.

81
Luchian Grigore

Vous avez déclaré static string theString;, mais je ne l'ai pas défini.

Comprendre

string Log::theString;

dans votre fichier cpp

16
Lol4t0