簡體   English   中英

C ++中靜態指針類成員的鏈接期間未定義的引用

[英]undefined reference during linkage for a static pointer class member in C++

抱歉,如果這是重復的。
這是我無法理解的有關靜態指針類成員的一個示例代碼。

#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 field_ (setField)的集合起作用,而對於p_field_ (setPField)卻不起作用? 而且它仍然可以訪問p_field_ (dumpPField)的地址嗎?

順便說一句,無論是否使用--std=c++11 ,我都嘗試了gcc4.8 / clang3.4。

加:

MyField * MyClass::p_field_ = NULL;

任何函數之外,例如int main() {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM