【发布时间】:2012-09-26 01:07:44
【问题描述】:
我有两个类:一个模板类和一个继承自它的常规类:
template <int N> class Vector
{
float data[N];
//etc. (math, mostly)
};
class Vector3 : public Vector<3>
{
//Vector3-specific stuff, like the cross product
};
现在,我想在子类中有 x/y/z 成员变量(完整成员,而不仅仅是 getter - 我也希望能够设置它们)。但是为了确保所有(继承的)数学都有效,x 必须引用与data[0]、y 到data[1] 等相同的内存。本质上,我想要一个联合,但我可以'不要在基类中声明一个,因为那时我不知道向量中的浮点数。
那么 - 这可以做到吗?是否有某种预处理器/类型定义/模板魔术可以实现我正在寻找的东西?
PS:如果有帮助,我正在使用带有 -std=c++0x 的 g++ 4.6.0。
编辑:虽然引用会给出我正在寻找的语法,但理想的解决方案不会使类变得更大(而且引用会 - 很多!Vector<3> 是 12 个字节. 带有引用的Vector3 是40!)。
【问题讨论】:
-
你为什么想要这个,而不是仅仅拥有引用适当数据值的 getter 和 setter?
-
为什么 getter 不能解决你的问题?
-
为什么不简单地使用 getter 和 setter?与任何其他可能的解决方案相比,它的魔力要小得多。例如
float x() const; float x(float newx); -
@Dave - 因为函数式的 getter 和 setter 令人讨厌。 Kristóf 的 jQuery 风格设置相当优雅,但是……它只是一个变量,我想使用等号,该死! (我最近做了很多 Ruby 编程——我想我被宠坏了。)
-
如果要使用等号,请使用引用 getter。
float& x()和const float& x() const。然后你可以说v.x() = 1。你仍然需要额外的括号,但它更接近。