неопределенная ссылка во время связывания для члена класса статического указателя в переполнении стека

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

#include <iostream>

class MyField {
public:
MyField() { std::cout << "ctr for MyField\n"; }
~MyField() { std::cout << "dtr for MyField\n"; }
friend std::ostream &operator<<(std::ostream &os, MyField field) {
os << "dump for MyField with addr: " << &field << std::endl;
return os;
}
};

class MyClass {
private:
static MyField field_;

public:
static MyField *p_field_;
static void setField(MyField const &field) { field_ = field; }
static void setPField(MyField *p_field) { p_field_ = p_field; }
static void dumpField() { std::cerr << "field_: " << field_; }
static void dumpPField() { std::cerr << "p_field_: " << *p_field_; }
MyClass() { std::cout << "ctr for MyClass\n"; }
~MyClass() { std::cout << "dtr for MyClass\n"; }
};

int main(void) {
MyClass::setPField(NULL);  /// undefined reference to MyClass::p_field_
MyClass::p_field_ = NULL;  /// undefined reference to MyClass::p_field_
MyField field;
MyClass::setField(field);    /// fine
MyClass::p_field_ = &field;  /// undefined reference to MyClass::p_field_
MyClass::setPField(&field);  /// undefined reference to MyClass::p_field_
MyClass();
MyClass::dumpField();   /// fine
MyClass::dumpPField();  /// fine
return 0;
}

Для класса MyClassзачем набор для поля field_(setField) работает, но не для p_field_(SetPField)? И это все еще работает для доступа к адресу p_field_(DumpPField)?

Кстати, я пробовал gcc4.8 / clang3.4 с или без --std=c++11,

0

Решение

Добавлять:

MyField * MyClass::p_field_ = NULL;

вне какой-либо функции, например как раз перед int main() {

3

Другие решения


По вопросам рекламы [email protected]