gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:08:10 24 4
gpt4 key购买 nike

我有一个 Tester 类,我决定将其声明为 static 类 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);
};

然后就可以了。为什么是这样?它会接缝我应该能够声明一个静态类并使用它的非静态成员,例如,如果我有一个静态 vector 。我正在使用 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 << "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 的评论进行反射(reflection)之后。

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

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

关于c++ - 静态对象作为类成员,要求对象的方法是静态的才能使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com