【发布时间】:2017-03-19 09:57:58
【问题描述】:
我有一个矢量 3D 类
class Vector3D{
public: float x; float y; float z;
//some functions, e.g. operator+ - * /
//some 3D-specific function
};
和一个向量 N-D 类。
template<int constSize> class VecFloatFix{
float database[constSize];
//some functions, e.g. operator+ - * /
};
我注意到两个类之间存在代码重复,所以我认为我应该让 Vector3D 派生自 VecFloatFix<3> :-
class Vector3D : public VecFloatFix<3>{
//some 3D-specific function
};
似乎一切都很好,只是有很多用户代码直接访问Vector3D::x,y,z。
是否可以在不破坏用户代码的情况下使Vector3D 派生自VecFloatFix<3>?
我最好的猜测是:-
template<int constSize> class VecFloatFix{
union{
float database[constSize];
float x,y,z; ????? sound like a hack
}
//some functions, e.g. operator+ - * /
};
编辑:将x,y,z 硬编码为VecFloatFix 是不可持续的。
如果我有一个派生自VecFloatFix<2> 的新类Vector2D,Vector2D::z 将编译得很好(危险)。
【问题讨论】:
-
如果
VecFloatFix中的database是protected或public,你可以在Vector3D类中执行类似float& x = database[0];的操作。 -
有多种变通方法可能会得到您想要的,但这取决于您的客户端代码在做什么。最终,我会质疑您尝试做的事情的价值。只需将这两种类型分开,并为它们的互操作提供便利(例如,两者之间的转换)。
-
在您的示例中,x,y,z 将被放置在一个浮点数(数据库 [0])中,因此 vec.x = 100.0 也会使 vec.y==100.0 。您可以使用
struct {float x,y,z;};来避免这种情况。 -
AAlgirdasPreidžius 这很可能会导致每个对象浪费大量空间。
-
引用通常占用空间(这是允许的,但标准没有强制要求)。
标签: c++ inheritance field unions