C++中指向self的成员变量指针

use*_*541 0 c++ static-members

当我尝试编译此代码时,为什么g ++报告错误?

class A {
  private:
    static A* Aptr[5];
  public:
    static int A_count;
    A() {
        Aptr[A_count] = this;
    }
};

int A::A_count = 0;

int main() {
    A a_;
    A b_;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

/tmp/ccrp4BGg.o: In function `A::A()':
try.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x18): undefined reference to `A::Aptr'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

Fil*_*efp 5

说明

你只申报您的静态数据成员命名的A::Aptr,但为了使用它,因为你是在构造函数中A,你必须提供一个定义.

链接器诊断可能会说未定义的引用,这可能很难与缺少的定义相关联,但它正在讨论其名称和存储位置的内部映射.

换一种说法; 链接器无法找到存储位置的引用(即条目)A::Aptr,这是有道理的:没有定义,您没有提供A::APtr任何存储空间.


你已经同时提供了一个声明 (2)定义 (4)A::A_count,如果你做同样的A::APtr你将所有设置.

class A {
 private:
    static A* Aptr[5];   // (1), declaration
 public:
    static int A_count;  // (2), declaration
    A() {
        Aptr[A_count] = this;
    }
};

A*  A::APtr[5];     // (3), definition  <-- previously missing! 
int A::A_count = 0; // (4), definition
Run Code Online (Sandbox Code Playgroud)

注意:您只是询问链接器错误,但我猜你的意思是A_count在构造一个类型的对象时增加A,这是你目前没有做的事情.