2015-11-17 3 views
1

Я хочу иметь простой класс, представляющий объект с уникальным идентификатором. Каждый новый объект получает идентификатор выше, чем ранее созданный. Важно отметить, что идентификатор для каждого объекта является постоянным, поэтому я обязан использовать список инициализации. По какой-то причине я получаю сообщение об ошибке undefined: Неопределенная ссылка на Test :: ID.Использование статического члена класса в качестве параметра в списке инициализации

class Test 
{ 
    const int m_id; 
    static int ID; 
public: 
    Test() : m_id(ID++) 
    { 
     cout << "Created object with id: " << m_id << endl; 
    } 
}; 
  1. Почему это?
  2. Как я могу это исправить?
  3. Как я могу убедиться, что идентификатор предварительно инициализирован 0, поэтому я не увеличиваю неинициализированную переменную?
+0

Не стоит использовать переменные во всех прописных буквах – Slava

+0

Эй, спасибо за совет ... Но почему? Это из-за общего способа именования констант, используя только верхний регистр или есть какая-то другая причина? –

+1

Именование констант с использованием прописных букв также является антипаттерном, которое исходит от создания констант с использованием препроцессора. Имя столкновения с препроцессором трудно поймать и сложно поддерживать, поэтому либо создание констант C++ и переменных в верхнем регистре - это не очень хорошая идея. – Slava

ответ

2

Необходимо зарезервировать хранилище для статичности в одной единицы перевода. Затем вы его инициализируете. Поэтому вам необходимо написать

int Test::ID = 0; 

в одном из ваших исходных файлов.

Рассмотрите возможность изменения типа на std::atomic<int>.. Это улучшит безопасность потока вашего кода.

+0

Спасибо, ваш совет помог мне. Я также посмотрю на std :: atomic. –