假设班级Coord3D
有方法
Point2D& Coord3D::get2DPart(){
return *(Point2D*)this;
}
(Coord3D只是int x; int y; int z;,而Point2D是它的2D版本,正好是int x;和int y;)
以下是安全的:
Point2D x = Coord3D(1,2,3).get2DPart();
甚至像
这样的东西Coord3D x = Coord3D(1,2,3).getSelf();
其中getSelf()
是执行return *this;
似乎它可能是安全的,但我问过的人并不确定。这样好吗?
编辑:这就是coord3D和Point2D:
struct Coord3D{
float x; float y; float z;
};
struct Point2D{
float x; float y;
};
答案 0 :(得分:5)
Point2D x = Coord3D(1,2,3).get2DPart();
相当于:
Point2D x( Coord3D(1,2,3).get2DPart() );
只要Coord3D
的构造函数正在执行,您在此处创建的临时Point2D
将持续存在。因此,在该范围内使用Coord3D
'this
是安全的。
请注意*(Point2D*)this
气味。如果Point3D
继承自Point2D
,您只需返回*this
即可。如果它们不相关,则很危险。
编辑,关注类型的问题更新:
鉴于Point2D和Point3D不相关,将一个投射到另一个可能会起作用,但它是高度未经修改的。更好的方法是让Point3D继承Point2D。另一种选择是将GetPoint2D()
添加到Point3D
,并让它创建 3D中的新2D点。但是,您可能会遇到返回对局部变量的引用的真正问题。最后,如果您确实冒险并按原样投射,至少使用reinterpret_cast
而不是C风格的演员。
答案 1 :(得分:0)
假设演员表首先是有效的(标准布局类型的常见子序列或适用于您的情况),那么这是有效的,因为*this
将一直有效,直到;
。