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

时间:2011-09-20 18:58:58

标签: c++ class object static-methods

我试图从包含第一个类的实例(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对象的初始化都很昂贵。

非常感谢任何人的帮助!

2 个答案:

答案 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;