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

Static object as class member, requiring object's methods are static to use them

本文关键字:静态 对象 方法 成员      更新时间:2023-10-16

我有一个类测试器,我决定将其声明为类 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的类型(由声明提供(,然后代码就可以工作了。