我正在尝试从另一个包含的类的对象 (myPlanet
) 的方法访问对象 (myEOS.calc(...)
) 的方法第一类的一个实例(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' 的 undefined reference ”的提示(这在没有
static`关键字的情况下完成)。
最后,请注意 Planet::setX
需要是静态的,因为指向此方法的指针必须具有“无类”签名,因为它被传递给无法处理方法/类的函数:
void (*fun_ptr)(float*) = & (Planet::setX);
这也强制对象 myEOS
是静态的(需要从静态函数访问),而且无论如何 EOS
对象的初始化是昂贵的。
非常感谢大家的帮助!
最佳答案
class Planet {
public:
static EOS myEOS; // want only one instance; cf. below
这段代码说“编译器:某个地方 later 将是这个类的 global EOS myEOS
。编译器说“ok”,并完成它的工作,等待您告诉它全局 EOS myEOS
在哪里。
然后链接器来清理编译器的困惑,并说“我找不到 myEOS
,你把 myEOS
放在哪里了?”并显示错误。
您需要将以下几行添加到某个 CPP 文件中:
float EOS::Y;
EOS Planet::myEOS;
关于c++ - 在 C++ 中访问成员对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7490312/