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;

2番目の関数で作成した変数に長方形の形状をコピーします

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 に答える