Определение частного статического члена класса - PullRequest
2 голосов
/ 02 января 2011
class B { /* ... */ };

class A {
public:
    A() { obj = NULL; }
private:
    static B* obj;
};

Однако это приводит к огромной массе ошибок компоновщика, поэтому символ obj не разрешен.

Каков "правильный" способ иметь такой закрытый статический член класса без этих ошибок компоновщика?

Ответы [ 6 ]

6 голосов
/ 02 января 2011

Вам нужно добавить

B *A::obj = NULL;

в один из ваших файлов cpp.Также обратите внимание, что если вы установите obj в конструкторе A, это означает, что всякий раз, когда вы создаете объект A, вы снова сбрасываете obj - поскольку он статический, существует только один объект obj, общий для всех экземпляров A.

6 голосов
/ 02 января 2011

Вы должны определить так:

это в заголовке:

class B { ... }

class A {
public:
    A() { obj = NULL; }
private:
    static B* obj;
}

это в источнике

B* A::obj = NULL;
3 голосов
/ 02 января 2011

http://www.parashift.com/c++-faq/ctors.html#faq-10.12

(И, как заметил @peoro, не забудьте завершить каждое определение класса ;).

3 голосов
/ 02 января 2011

Вы должны инициализировать obj в файле cpp:

B* A::obj = NULL;

Вы не можете инициализировать его в конструкторе, поскольку это статическая переменная.

1 голос
/ 03 января 2011

Вы объявили статический член, но не определили его.

Кроме того, вы устанавливаете его значение всякий раз, когда создается любой экземпляр A, тогда как на самом деле вы хотите, чтобы он был инициализирован только один раз.

class B;

class A {
private:
    static B* obj;
};

B* A::obj = NULL;

Поскольку определение вашего класса A, вероятно, находится в заголовочном файле, вы должны убедиться, что определение obj (которое я добавил) содержится в одном (и только одном) файле .cpp. Это связано с тем, что он должен появляться только один раз в вашем скомпилированном проекте, но содержимое файла заголовка может быть #included несколько раз.

1 голос
/ 02 января 2011

Ошибки связывания связаны с тем, что вам также нужно объявлять статические переменные вне определения класса исключительно для связи цели и статического распределения памяти как

B* A::obj;
...