这是一个基本结构(我希望)
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结构相似。
答案 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。