неразрешенный внешний символ при доступе к статической переменной - PullRequest
4 голосов
/ 05 декабря 2011
class CommandManager {

public:
    void sendText(std::string command);
    static bool CommandManager::started;

private:


    bool parseCommand(std::string commands);

    void changeSpeed(std::vector<std::string> vec);
    void help(std::vector<std::string> vec);
};

А вот код клиента:

CommandManager::started = true;

Связав эти два файла вместе, я получаю:

1> UAlbertaBotModule.obj: ошибка LNK2001: неразрешенный внешний символ"public: static bool CommandManager :: старт" (?арт @ CommandManager @@ 2_NA)

1> C: \ Development \ School \ cmput350-uofabot \ UAlbertaBot \ vs2008 \ Release \ UAlbertaBot.dll: фатальная ошибкаLNK1120: 1 неразрешенное внешнее

Где я тут ошибся?

Ответы [ 3 ]

21 голосов
/ 05 декабря 2011

Вы делаете это неправильно.

class CommandManager {

public:
    void sendText(std::string command);
    static bool started; //NOT this -> bool CommandManager::started
    //...
};

затем поместите определение статического члена в .cpp файл как:

#include "CommandManager.h" //or whatever it is

bool CommandManager::started = true; //you must do this in .cpp file

Теперь вы можете использовать CommandManager::started в коде своего клиента.

4 голосов
/ 05 декабря 2011

Вы должны иметь в своем классе:

class CommandManager {
 public:
  void sendText(std::string command);
  static bool started;
  //// etc
};

и вне вашего класса, в файле *.cc (а не в заголовочном файле *.hh), определение типа

bool CommandManager::started;

Кстати, я думаю, тебе лучше сделать это private.

2 голосов
/ 05 декабря 2011

Рассмотрите возможность размещения

bool CommandManager::started;

там, где вы определяете других членов.

...