当我尝试编译此代码时,为什么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
答案 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;
}