С++ объявляет статический объект в классе

Я пытаюсь объявить статический объект класса A, который я написал в другом классе B, например:

class A // just an example
{
 int x;
public:
 A(){ x = 4; }
 int getX() { return x; }
};

class B
{
 static A obj1; // <- Problem happens here
public:
 static void start();
};

int main()
{
 B::start();
}

void B::start()
{
 int x = obj1.getX();
}

Я хочу добиться того, чтобы int x в B::start() равнялся int x в class A (4).

Я пробовал все это за прошлый час, и все, что я понял, было то, что C++ не разрешает объявления статических объектов. Это верно?

Если да, то здесь мой вопрос. Как я могу получить тот же результат? Каковы мои доступные обходные пути? Помня о том, что остальная часть моего кода зависит от того, какие функции в классе B статичны.

ошибка

ошибка LNK2001: неразрешенный внешний символ "private: static class AB :: obj1"

Благодарю!

2 ответа

Вы должны инициализировать static var, код:

class A // just an example
{
 int x;
public:
 A(){ x = 4; }
 int getX() { return x; }
};

class B
{
 static A obj1; // <- Problem happens here
public:
 static void start();
};

A B::obj1; // init static var

int main()
{
 B::start();
}

void B::start()
{
 int x = obj1.getX();
}


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

A B::obj1;

Для обычных, нестатических переменных-членов вам не нужен этот шаг, потому что переменные объявляются за кулисами как часть конструктора. Эти переменные затем привязаны к экземпляру только что построенного класса. Но статические переменные не привязаны ни к одному экземпляру класса; они разделяются всеми экземплярами класса. Поэтому конструкторы не могут с ними справиться должным образом.

C++ оборачивается этим, заставляя вас вручную объявлять (и, возможно, инициализировать) любые статические переменные-члены. В зависимости от того, где они объявлены, они обычно создаются до запуска функции main(), поэтому они доступны для использования немедленно.

licensed under cc by-sa 3.0 with attribution.