我试图从包含第一个类的实例(myEOS.calc(...)
)的另一个类的对象(myPlanet
)的方法访问对象的方法(static EOS myEOS
) :
// class in class
class EOS {
public:
static float Y;
float calc(float);
};
float EOS::calc(float x){
return x; // some complicated calculation
}
class Planet {
public:
static EOS myEOS; // want only one instance; cf. below
static void setX(float* X); // must be static; cf. below
};
void Planet::setX(float* X) {
*X = myEOS.calc(*X); // will give an error
}
int main(){
Planet myPlanet;
}
这将返回链接时错误
In function `Planet::setX(float*)':
test.cpp:(.text+0x1a): undefined reference to `Planet::myEOS'
collect2: ld returned 1 exit status
使用-c
单独编译,类和主程序(主文件中带有#include
)不会出错;这看起来像解决方案的关键,但我没有看到锁!
有人知道问题是什么吗?我希望我的意图很明确,即使有一些根本的误解。我认为我有点理解类和重读教程,但没有看到类中的类(不是嵌套类)的讨论。我无法在这个网站上找到类似的问题(我通常可以得到我需要的所有答案!)。
顺便说一句,在somebody else's question之后,添加显式构造函数(并在Planet的初始化列表中正确初始化EOS)并未删除编译器关于“未定义引用Planet::myEOS'" (this done without the
static”关键字的抱怨。 / p>
最后,请注意Planet::setX
需要是静态的,因为指向此方法的指针必须具有“无类别”签名,因为它传递给无法处理方法/类的函数:
void (*fun_ptr)(float*) = & (Planet::setX);
这也会强制对象myEOS
是静态的(需要从静态函数访问),无论如何EOS
对象的初始化都很昂贵。
非常感谢任何人的帮助!
答案 0 :(得分:2)
定义静态变量。
// class in class
class EOS {
public:
static float Y;
float calc(float);
};
float EOS::calc(float x){
return x; // some complicated calculation
}
class Planet {
public:
static EOS myEOS; // want only one instance; cf. below
static void setX(float* X); // must be static; cf. below
};
void Planet::setX(float* X) {
*X = myEOS.calc(*X); // will give an error
}
// -------------------------
EOS Planet::myEOS;
float Planet::Y /* = <some value> if it makes sense*/;
// -------------------------
int main(){
Planet myPlanet;
}
参见标准(98)中的9.4.2静态数据成员。
答案 1 :(得分:2)
class Planet {
public:
static EOS myEOS; // want only one instance; cf. below
这段代码说“编译器:某个地方以后将是这个类的全局 EOS myEOS
。并且编译器说”ok“,并且它是这样的等着你告诉它全球EOS myEOS
的位置
然后链接器出现以清理编译器的混乱,并说“我找不到myEOS
,你在哪里放置myEOS
?”并显示错误。
您需要将以下行添加到某处的CPP文件中:
float EOS::Y;
EOS Planet::myEOS;