0

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

class Tester {

public:

    bool test(const Data &d);
};

class Foo {

    static Tester tester;  
};

但是当我从 Foo 的一个实例调用 tester.test(data) 时,程序编译得很好,但在调用后没有响应。当我将 Tester::test 设为静态时,

class Tester {

public:

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

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

4

1 回答 1

2

我相信您会收到链接器错误(对吗?)。这是因为你没有给出 的定义Foo::tester。(你只是提供它的声明。)

Foo's.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;
}

它编译、链接、运行并输出Yes

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

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

仔细想想,其实是有道理的。如果tester未定义,则不能对其调用(非静态)方法。但是,如果方法是静态的,则不需要对象,只需要其类型即可进行调用。当编译器看到调用时tester.test(data);(我猜)它只考虑tester(由声明提供)的类型,然后代码就可以工作了。

于 2013-10-03T15:35:05.953 回答