2013-04-07 2 views
2

У меня есть простой класс для хранения данных датчиков, которые могут быть суммированыC++ статической переменной классы без CPP файла

class Data 
{ 
    public: 
    Data(){timestamp = Time::now(); id = sNextID++; data = 0; type = DATA_TYPE_UNKNOWN;} 

    double data; 
    Time timestamp; 
    DataType type; 

    private: 
    static unsigned int sNextID; 
}; 

У меня есть заголовочный файл, объявляющей куча подобных классов данных. Учитывая простоту классов, нет необходимости в файле cpp реализации.

Проблема в том, что без файла реализации, как инициализировать sNextID? Я где-то читал, что по умолчанию он равен 0, что было бы хорошо, хотя полагаться на это кажется немного хакерским. Что еще более важно, однако, не инициализируя его где-то, компоновщик жалуется на неопределенную ссылку.

ответ

5

Использование inline function (свободно стоящий или член):

inline unsigned &sNextID() 
{ 
    static unsigned data = 0; 
    return data; 
} 

Или шаблон класса (Defenition из его статика can be in header file):

template<typename tag> 
struct Foo 
{ 
    static unsigned sNextID; 
}; 

template<typename tag> 
unsigned Foo<tag>::sNextID=0; 

LIVE DEMO

+0

О, мне нравится шаблон. Я еще не стал использовать шаблоны, но я все равно буду двигаться в этом направлении. благодаря – ryan0270

1

в заголовочном файле (скажем, это имя data.h), добавьте это в конец

class Data 
{ 
    ..... 
    private: 
    static unsigned int sNextID; 
}; 

#ifdef MY_INIT 
unsigned int sNextID = 0; 
#endif 

в файле, где у вас есть главный

#define MY_INIT 
#include "data.h" 

во всех других файлах, где вы в том числе заголовок, просто обычный

#include "data.h" 

Это гарантирует, что линия unsigned int sNextID = 0; будет скомпилирован только в одну единицу перевода - одну с main.

Смежные вопросы