静态对象作为类成员,要求对象的方法都是静态的才能使用它们
Static object as class member, requiring object's methods are static to use them
我有一个类测试器,我决定将其声明为类 Foo 的成员,
class Tester {
public:
bool test(const Data &d);
};
class Foo {
static Tester tester;
};
但是当我从 Foo 的实例调用 tester.test(data( 时,程序编译正常,但在调用后没有响应。 当我制作测试器::测试静态时,
class Tester {
public:
static bool test(const data &d);
};
然后它起作用了。 这是为什么呢? 例如,如果我有一个静态向量,我应该能够声明一个静态类并使用它的非静态成员。 我正在使用 gcc 4.7 进行编译。
我相信你得到了一个链接器错误(对吧?这是因为您未能给出Foo::tester
的定义。(您只是提供其声明。
在Foo
的.cpp
文件中添加以下行:
Tester Foo::tester;
这是Foo::tester
的定义,并修复了链接问题。
更新 这是一个完整的示例:
#include <iostream>
class Data {};
class Tester {
public:
bool test(const Data &) { std::cout << "Yesn"; return true; }
};
class Foo {
static Tester tester;
public:
Foo() {
Data data;
tester.test(data);
}
};
Tester Foo::tester;
int main() {
Foo f;
}
它编译,链接,运行并输出Yes
。
更新 2 在反思本·沃格特的评论之后。
如果删除Foo::tester
的定义,则代码不会链接。如果您随后将Tester::test
设置为静态(如OP所述(,则它将再次链接并按预期运行。
仔细想想,这实际上是有道理的。如果未定义tester
,则无法对其调用(非静态(方法。但是,如果该方法是静态的,则不需要对象,只需要其类型即可进行调用。当编译器看到调用tester.test(data);
时(我猜(它只考虑tester
的类型(由声明提供(,然后代码就可以工作了。
相关文章:
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我可以读取静态对象中的文件.txt吗?C++
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 完全释放静态对象内存
- 静态对象指针
- C++文件中.cpp静态对象声明
- C++类中定义静态对象
- 在初始化类的静态对象之前,是否保证初始化该类的静态成员?
- 静态对象如何调用私有构造函数
- cpp 静态对象实例化
- 等效于 Java 静态对象类C++
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在dlclose()之前破坏的静态对象
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- c++ 防止类共享静态对象
- 什么时候构造函数为静态对象
- 为什么本地静态对象的初始化使用隐藏的防护标志?