【发布时间】:2017-12-30 05:21:43
【问题描述】:
我正在阅读一本书(Eric Lengyel 的游戏引擎开发基础),这本书正在用 c++ 编写一些向量操作,这里是 sn-p:
struct Vector3D
{
float x, y, z;
Vector3D() = default;
Vector3D(float a, float b, float c)
{
x = a;
y = b;
z = c;
}
float& operator [](int i)
{
return((&x)[i]);
}
};
我特别关心这件作品:
float& operator [](int i)
{
return((&x)[i]);
}
现在,无论输入什么索引,我都希望这段代码返回 x。但是,根据输入输出相应的变量(x、y 或 z)。为什么是这样?感谢您的帮助。
【问题讨论】:
-
这是在滥用undefined behavior(解除对越界指针的引用),因为它知道编译器如何将成员放入对象中的特定于实现的布局。如果你的书推荐了类似的东西,那么你应该把它扔掉!
-
按照@Someprogrammerdude 所说的,我想补充一点,它是最糟糕的未定义行为之一,未定义行为将在 99.9% 的时间内起作用(因为很少有编译器会重新排列或在这些浮动之间放置填充)。如果/当它确实崩溃时,将很难追踪。
-
@Someprogrammerdude 这本书并没有特别推荐它,但建议这是 3d 矢量的简单 c++ 表示。将开关与 case 0:return &x、case 1:return &y 等一起使用会更好吗?
-
@JoeGuida,只定义一个三元素数组会更容易,或者最好使用
std::array<float, 3> -
@AndyG,谢谢,我可以直接访问元素,例如:v.x、v.y、v.z。我只是想知道那个操作员是如何工作的。他在这里做了一个类似的 Vector3D& operator *= (float s) { x *= s; y *= s; z *= s;返回(*这个); }
标签: c++ vector 3d game-engine