我有一个类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进行编译。
答案 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);
的类型(由声明提供)然后代码工作。