从堆栈上的匿名对象返回对* this的引用

时间:2011-10-02 08:02:47

标签: c++

假设班级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;
};

2 个答案:

答案 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将一直有效,直到;