【问题标题】:undefined reference during linkage for a static pointer class member in C++C++ 中静态指针类成员链接期间未定义的引用
【发布时间】:2014-07-26 11:27:48
【问题描述】:

抱歉,如果这是重复的。
这是一段关于静态指针类成员我无法理解的示例代码。

#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。

【问题讨论】:

标签: c++ static-methods static-members lifetime


【解决方案1】:

添加:

MyField * MyClass::p_field_ = NULL;

在任何函数之外,例如就在int main() {之前

【讨论】:

  • 我猜你的意思是 Myclass::p_field_ = NULL; 在函数 main 中,但它也不起作用。但是,我会将其添加到源代码中以使问题更清楚。
  • 不,尝试按照他在命名空间(全局)范围内编写的操作。
  • 他的意思是MyField *MyClass::p_field; 在main 之外。 (= NULL 是多余的,因为静态指针的默认初始化是空指针)
  • 你还需要MyField MyClass::field_;,在main之外。
  • @MattMcNabb 哇,这行得通。但是为什么没有定义MyField MyClass::field_实际上编译运行没有问题呢?
猜你喜欢
  • 2014-02-17
  • 2021-07-10
相关资源
最近更新 更多