0

在 C++ 中,我有一个矩形参数进入一个函数。因为我保持我的系统抽象,所以我创建了自己的 Rectangle 类。我传递给它的函数(对于 SFML 图形库)使用它自己的 RectangleShape 对象。所以,我需要将我的 Rectangle 转换为 RectangleShape。

我去创建一个函数来执行此操作,但我对正在创建哪些对象、正在复制谁以及什么是最快的感到困惑。情况如下:

RectangleShape MyClass::ConvertRectangleToRectangleShape(const Rectangle& inRectangle)
{
    Vector2f size(inRectangle.GetWidth(), inRectangle.GetHeight());
    RectangleShape convertedRectangle(size);
    Vector2f position(inRectangle.GetPosition.GetX(), inRectangle.GetPosition.GetY());
    returnShape.SetPosition(position);

    return convertedRectangle;
}

void MyClass::DrawShape(const Rectangle& inRectangle)
{
    // Convert the shape
    RectangleShape convertedShape = ConvertRectangleToRectangleShape(inRectangle);
    // Rest of code here
}

因此,如您所见,我的所有对象都不是指针。所以我不需要处理那个。

我返回的对象在堆栈上,但不是引用。当我退回它时,它会被复制,对吗?那条线

return convertedRectangle;

它将矩形形状复制到我在第二个函数中创建的变量中

RectangleShape convertedShape = ConvertRectangleToRectangleShape(inRectangle);

对?

我不能将它作为参考变量返回,因为一旦我离开函数的范围,它就会被取消分配,对吧?

RectangleShape& MyClass::ConvertRectangleToRectangleShape(const Rectangle& inRectangle)

如果我不能将它作为参考返回,并且我不想要副本,我是否只需将代码粘贴到函数中?还是#define?这里的正确方法是什么,或者我错在哪里?谢谢!

4

1 回答 1

3

您的案例更简洁地表示为转换构造函数

class RectangleShape{
    ....
    RectangleShape(const Rectangle&);
    ...
};

然后你会写

RectangleShape convertedShape = inRectangle;

它会像你预期的那样工作,没有任何不必要的副本或构造。

这将类似于这种风格。

RectangleShape convertedShape;
convertedShape.InitFrom(inRectangle);

这也不需要副本,因为它直接作为最终对象的方法调用。

克里斯的建议(如果我理解正确的话)需要对 , 进行更改class Rectangle,以允许其将自身转换为RectangleShape.

class Rectangle{
    ....
    operator RectangleShape();
    ...
};

它将允许类似优雅的分配代码,但我不确定他打算如何在没有副本的情况下从一个转换为另一个,如果它们是不相关的类。

如果你不能修改RectangleShape,我能想到的最接近的就是做这样的事情。

InitRectangleShape(convertedShape, inRectangle);
....    
void InitRectangleShape(RectangleShape& convertedShape,const Rectangle& inRectangle);

除非我大错特错,这类似于通常如何实现返回值优化。这将我们带到其他评论者提出的观点,编译器可能已经为您优化了副本。

于 2013-01-02T05:31:35.683 回答