静态对象作为类成员,要求对象的方法是静态的来使用它们

时间:2013-10-03 15:25:05

标签: c++

我有一个类Tester,我决定将static声明为类Foo的成员,

class Tester {

public:

    bool test(const Data &d);
};

class Foo {

    static Tester tester;  
};

但是当我从Foo的一个实例调用tester.test(数据)时,程序编译得很好,但是在调用之后没有响应。当我使Tester :: test static时,

class Tester {

public:

    static bool test(const data &d);
};

然后它有效。为什么是这样?我应该能够声明一个静态类并使用它的非静态成员,例如,如果我有一个静态向量。我正在使用gcc 4.7进行编译。

1 个答案:

答案 0 :(得分:2)

我相信你得到一个链接器错误(对吧?)。这是因为您未能给出Foo::tester的定义。 (你只是提供声明。)

Foo的{​​{1}}文件中添加以下行:

.cpp

这是Tester Foo::tester; 的定义并修复了链接问题。

更新以下是一个完整的示例:

Foo::tester

它编译,链接,运行并输出#include <iostream> class Data {}; class Tester { public: bool test(const Data &) { std::cout << "Yes\n"; return true; } }; class Foo { static Tester tester; public: Foo() { Data data; tester.test(data); } }; Tester Foo::tester; int main() { Foo f; }

更新2 在对Ben Voigt的评论进行反思之后。

如果删除Yes的定义,则代码不会链接。如果你随后使Foo::tester静态(如OP所说)那么它再次链接并按预期运行。

经过反思,它确实有意义。如果未定义Tester::test,则无法在其上调用(非静态)方法。但是,如果方法是静态的,那么您不需要对象,只需要其类型即可进行调用。当编译器看到调用tester然后(我猜)它只考虑tester.test(data);的类型(由声明提供)然后代码工作。