1

如何在 C++ 中初始化静态对象?我正在寻找类似java中的静态块的东西。

我试过这个:

Foo.hpp

class Foo{
    public:
    static Bar b;
    static String s;
    static Bar setB();
};

Foo.cpp

Bar Foo::b = Foo::setB();
String Foo::s = "something";
Bar Foo::setB()
{
    Bar bb;
    bb.use(s);
    return bb;
}

没有编译错误,但它不起作用。

非常感谢

4

4 回答 4

2

你的代码:

class Foo{
    public:
    static Bar b;
    static Bar setB();
}

你的评论:

没有编译错误

那是不正确的。由于缺少分号,无法编译。

当指出这一点时,大多数 SO 发帖人随后在一些评论中声称“但这只是一个打字错误,我会纠正它”,从而通过使已发布的答案无效来加剧错误。

简而言之,当您发布代码时,请复制并粘贴真实代码。不要重新输入。复制和粘贴。

现在,对于核心问题,继续上述评论,即

它不工作。

好吧,假设您的真实代码具有适当的分号,并且Bar已定义等,那么该部分也是完全错误的。

我用 Visual C++ 和 MingW g++ 对其进行了测试,并且(当更正分号等时)它工作得很好。

于 2012-11-13T04:26:16.153 回答
1

Bar需要一个无参数构造函数,以便它可以将自身初始化为预期值。

不需要,Foo::setBar()因为 Foo 已经有了Bar实例。

于 2012-11-13T04:24:24.393 回答
0

您的示例有效,除了您实际上没有初始化任何东西:

#include <iostream>

class Foo{
public:
    static int b;
    static int setB();
};

int Foo::b = Foo::setB();
int Foo::setB()
{
    int bb;
    bb = 42;  // Not in your example
    return bb;
}

int main()
{
    std::cout << 42 << std::endl;
}

这将打印 42。(请注意,我已将“Bar”更改为“int”,因为您没有发布 Bar 的定义。)

于 2012-11-13T04:27:57.453 回答
0

根本原因:类定义末尾没有分号。当我放一个时效果很好。

建议:请在提问时提供更多代码(如果可能,请提供完整代码),请勿再次输入代码,只需复制粘贴即可。

于 2012-11-13T04:48:06.547 回答