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

标签 c++ class object static-methods

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

相关文章:

c++ - 如何 "Overflow"超出特定范围(如 30 - 100)的值

Java:可能有相互的、最终的类引用吗?

java - 接口(interface)和抽象类广告方法覆盖

java - 字符串在 java 中成为对象的必要性是什么

c# - 如何在没有序列化工具的情况下将对象转换为 XML

c++ - 如何在字符串中插入制表符?

c++ - 是否正在使用 placement-new,复制存储然后访问值未定义行为?

c++ - 以元组为键的自定义排序有序映射

c++ - 在头文件中定义类是否正确?

Java 我想保存一个变量,并且我有 2 个小程序