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

时间:2014-06-05 01:20:11

标签: 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;
}

/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

4 个答案:

答案 0 :(得分:5)

解释

您只有声明您的静态数据成员名为A::Aptr,但为了使用它,因为您在{{1}的构造函数中您必须提供定义

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

换句话说;链接器无法找到存储A的位置的引用(即条目),这是有道理的:没有定义,您没有给A::Aptr任何存储使用。


解决方案

您已经提供了声明 (2)定义 (4) A::APtr,如果您对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 类型的对象时增加A_count,你目前做的事情。功能

答案 1 :(得分:1)

您需要在类之外定义它,就像任何其他静态变量一样:

答案 2 :(得分:0)

因为它是静态的,你需要在类之外定义Aptr,现在你只声明了它但没有定义并初始化它。这意味着链接器无法找到它。您还想增加A_count?:

class A {
 private:
    static A* Aptr[5];
 public:
    static int A_count;
    A() {
        Aptr[A_count] = this;
        A_count++; //I presume you want to do something like this too
    }
};

int A::A_count = 0;
A* A::Aptr[5] = { nullptr }

int main() {
    A a_;
    A b_;
    return 0;
}

答案 3 :(得分:0)

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


int main() {
    A a_;
    A b_;
    return 0;
}