0

Здравствуйте, у меня есть класс "Клиент" со следующими полями:

protected:
    int priority;
    BrokerIfc *broker;
    ostream& messagesSink;
    int id;
    list<Topic> topics;
    static int id_generator;

Поле id_generator должно служить некоторым генератором id для клиентов.

Конструктор выглдяит следующим образом:

Client::Client(int priority, BrokerIfc& broker, ostream& messagesSink) :
        priority(priority), broker(&broker), messagesSink(messagesSink), id(
                id_generator++) {}

Работаю в Visual Studio, его компилятор на меня кричит, что:

неразрешенный внешний символ ""protected: static int Client::id_generator" (?id_generator@Client@@1HA)"

То есть буквально на поле, которое у него же и определенно.

Я бы ожидал сообщения о не инициализации, но почему именно это ?

free_ze
  • 8,656
  • 1
    Если Ваши объекты могут быть созданы в разных потоках, то Вы рискуете получить 2 объекта с одинаковым id. – ixSci Jun 20 '16 at 09:31

2 Answers2

2

вы только объявили статическую переменную класса, ее нужно теперь определить где либо (например если у вас класс в Client.h, то объявить ее можно в Client.cpp), примерно так

int Client::id_generator;

возможно вы ее захотите инициализировать

int Client::id_generator = 0;

Подробней про объявление и определение переменных тут https://msdn.microsoft.com/ru-ru/library/0e5kx78b.aspx?f=255&MSPPError=-2147217396

Denis Zaikin
  • 441
  • 4
  • 6
1

Для static переменных в классе недостаточно их описать в самом классе, их еще надо явно определить где-то в модуле (связанном .cpp файле).

Denis
  • 8,910
  • 11
  • 31
  • 55
Aim X
  • 1,116