Класс C ++, объявленный как статический член класса - PullRequest
1 голос
/ 21 июля 2010

Есть ли проблема с объявлением класса со статическим членом, который является другим классом в заголовке.Например:

class Stat
{
public:
    int avar;
    Stat();
};

class Test
{
public:
    static Stat stat;
};

Причина, по которой я боюсь, что это может вызвать проблемы, заключается в том, что это кажется очень похожим на объявление глобальной переменной в заголовке.Если он включен в два файла cpp, глобальный объект объявляется в обоих файлах, что приводит к ошибке.

'stat' в приведенном выше примере все еще необходимо создать только один раз между двумя файлами cpp, такими же, как глобальный, так каккомпилятор обрабатывает одну ситуацию, а не другую, или это ответ, который он не может?

Ответы [ 2 ]

4 голосов
/ 21 июля 2010

Ответ в том, что вы ОБЪЯВЛЯЕТЕ статическое (как вы можете ОБЪЯВИТЬ глобальное).Но вы должны определять его только в файлах cpp.

в формате .h:

extern int myGlobal;
class A
{
  static int myStaticMember;
};

в файле .cpp:

int myGlobal = 42;
int A::myStaticMember = 42;
4 голосов
/ 21 июля 2010

Вы только объявляете статическую переменную-член класса в самом классе, вам нужно определить отдельно в файле cpp:

Stat Test::stat;

Таким образом, нет ошибок компилятора или компоновщика. Объявление в вашем заголовке просто ссылается на определение в файле cpp.

В терминах глобальных переменных объявление эквивалентно:

extern int global;

И определение эквивалентно:

int global;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...