【问题标题】:C++: How to initialize static member variables which are not integral types?C ++:如何初始化不是整数类型的静态成员变量?
【发布时间】:2012-11-13 04:14:40
【问题描述】:

如何在 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;
}

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

非常感谢

【问题讨论】:

  • 我不知道为什么它不工作,因为它应该:)
  • 谢谢你们,你们说得对,我应该贴出实际代码(名字很复杂,只是不想弄乱问题)。有用。问题是我在 setB 函数中使用了另一个静态变量,该变量是在 b 之后初始化的。

标签: c++ static initialization


【解决方案1】:

您的代码:

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

您的评论:

没有编译错误

不正确。由于缺少分号,它无法编译

当指出这一点时,大多数 SO 发帖者会在一些评论中声称“但这只是一个打字错误,我会纠正它”,因此 复合 通过使已发布的答案无效来混合错误。

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

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

它不工作。

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

我使用 Visual C++ 和 MingW g++ 对其进行了测试,并且(在纠正分号等时)它工作正常。

【讨论】:

  • 你是对的,我应该发布实际代码。现在我已经编辑了帖子,虽然我发现了问题,并将其作为评论发布。谢谢
【解决方案2】:

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

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

【讨论】:

  • 我试图简化代码。 Bar b 实际上是一个列表,应该在其中插入一些字符串。所以我需要setBar()。我编辑了帖子,但发现了问题。
【解决方案3】:

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

#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 的定义。)

【讨论】:

  • 我希望它打印 42,因为 42 是明确打印的 :-)
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-05-18
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多