const时的C ++行为

时间:2010-11-30 02:06:13

标签: c++

这是一个基本结构(我希望)

struct SomeType {
    float a;
    float b;
    float c;
    float d;

    SomeType(float, float, float, float);
};

和来源

SomeType::SomeType(float na, float nb, float nc, float nd) : a(na), b(nb), c(nc), d(nd) {}

我有一个班级

struct SomeClass {
    static const SomeType v;

    SomeClass();
};

当我初始化它时

const SomeType SomeClass::v(0,0,0,0);

我的vales变成inf或nan或-nan。以前有人见过这个,或者知道如何修复它?

编辑:固定类型

编辑:这与我原来的例子非常接近。我有多个类与SomeClass结构相似。

6 个答案:

答案 0 :(得分:3)

const SomeClass::v(0,0,0,0);

将无法编译,因为您未指定v的类型。

否则,这对我有用(并且应该有效)。

也许您应该在一个代码清单中发布一个完整的,可编译的示例,以便我们可以看到您真正的想法。

答案 1 :(得分:2)

你从哪些代码看到那些不正确的值?如果它来自另一个全局变量的构造函数,请记住static initialization order fiasco; v的构造函数可能还没有运行。

SomeType构造函数中输入一个输出语句,并在看到不正确的值之前检查输出是否发生。

答案 2 :(得分:1)

虽然我没有重现那种确切的行为,但初始化并没有指定类型。它应该是:

const SomeType SomeClass::v(0, 0, 0, 0);

执行此操作后,它可以正常工作。

答案 3 :(得分:1)

工作版:

#include <iostream>


struct SomeType {
    float a;
    float b;
    float c;
    float d;

    SomeType(float, float, float, float);

public:

    void print() const
    {
        std::cout << this->a << std::endl;
        std::cout << this->b << std::endl;
        std::cout << this->c << std::endl;
        std::cout << this->d << std::endl;
    }
};

SomeType::SomeType(float na, float nb, float nc, float nd) : a(na), b(nb), c(nc), d(nd) {}

class SomeClass {
    static const SomeType v;

    SomeClass() {}

public:

    static void print()
    {
        v.print();
    }
};

const SomeType SomeClass::v(0.0f,0.0f,0.0f,0.0f);

void main()
{
    SomeClass::print();
}

输出将是: 0 0 0 0

答案 4 :(得分:1)

另一个人告诉你问题是(静态初始化命令惨败)。我会为你提供一个解决方案。你需要摆脱构造函数,所以类型将成为POD

struct SomeType {
    float a;
    float b;
    float c;
    float d;
};

然后你需要用一个只包含常量表达式的支撑初始化列表来初始化它(这是仅限于整数常量表达式)

const SomeType SomeClass::v = { 0, 0, 0, 0 };

或者,但仅在零的情况下,您可以省略显式值并使用空括号

const SomeType SomeClass::v = { };

在这种情况下,C ++会保证在尝试读取它的任何代码运行之前初始化值。

答案 5 :(得分:0)

由于SomeType SomeClass::v是静态的,您是否真的需要将SomeType的成员显式初始化为零?

如果您只是将SomeType的成员初始化为零(或者定义默认的Ctor SomeType)并且只是将静态成员初始化为const SomeType SomeClass::v;,则可以避免初始化SomeType的Ctor。