gpt4 book ai didi

c++ - 在 C++ 中访问成员对象的方法

转载 作者:行者123 更新时间:2023-11-27 23:28:44 26 4
gpt4 key购买 nike

我正在尝试从另一个包含的类的对象 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com