2011-01-02 2 views
2
class B { /* ... */ }; 

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

Однако это производит огромную массу ошибок компоновщика, что символ OBJ является нерешенным.Определение частного статического члена класса

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

ответ

6

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

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

class B { ... } 

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

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

B* A::obj = NULL; 
+7

Скорее всего, ему не нужно 'A() {obj = NULL; } 'then –

+2

@ 7vies: не включая конструктор A изменит значение кода. В настоящее время построение нового объекта A сбрасывает статический член obj (что может быть важно). –

+1

@Martin: Хотя я согласен с тем, что принятие инициализации статического члена из конструктора меняет поведение, мне любопытно, почему кто-то откроет себя для потенциальных утечек памяти, которые могут (и, вероятно, будут) вызваны. Если какой-либо объект A создает объект B в куче, при следующем создании объекта A объект B будет просочиться. –

6

Вы должны добавить

B *A::obj = NULL; 

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

1

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

B* A::obj; 
3

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

B* A::obj = NULL; 

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

+0

Как бы то ни было, он назначает ему, а не пытается инициализировать его в конструкторе, поэтому он получает компоновщик, а не ошибки компилятора. –

3

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

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

+0

missing ';' ошибка компиляции, а не одна ссылка –

+1

+1 для ссылки на часто задаваемые вопросы –

+0

@ 7vies: Вот почему эта часть представляет собой скопированный PS. – aschepler

1

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

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

class B; 

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

B* A::obj = NULL; 

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

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