我想做的是创建一个新的自定义数据类型,它的行为与所有其他原始类型一样。具体来说,这种数据类型看起来像一个定点分数。我创建了一个类来表示这种数据类型,称为“class FixedPoint”,其中有一些方法可以将“FixedPoint”类型转换为“int”或“double”或“unsigned int”等。这很好。
现在,如果我想从中转换"int" to "FixedPoint"
怎么办?最初我的解决方案是有一个构造函数:
FixedPoint(int i) { /* some conversion from 'int' to 'FixedPoint' in here */ }
这行得通......但你不能像这样把它放到一个联合中:
union {
FixedPoint p;
};
这会中断,因为“FixedPoint”没有隐式的普通构造函数(我们刚刚定义了一个构造函数,“FixedPoint(int i)”)。
总而言之,整个问题是“我们想要cast from some type T to type FixedPoint without explicitly defining a constructor
在联合中使用我们的 FixedPoint 类型”。
我认为解决方案是但无法在线找到任何证据:定义一个重载的全局类型转换运算符以从“int”转换为“FixedPoint”。
有没有办法在不使用类构造函数的情况下做到这一点?我希望能够在联合中使用这个类。我尝试过的(在全球范围内):
operator (FixedPoint f, int a) { ... } //compiler complains about this is not a method or non-static.
还有一个小例子表明联合不喜欢构造函数(他们喜欢 POD)
class bob
{
public:
bob(int a) { m_num = a; }
private:
int m_num;
};
void duck()
{
union
{
bob a;
};
}
在 Visual Studio 中看到的这个错误是:
error C2620: member 'duck::<unnamed-tag>::a' of union 'duck::<unnamed-tag>' has user-defined constructor or non-trivial default constructor
有任何想法吗?谢谢