8

以下は、私のSpriteクラスの要約版です。

class Sprite
{
    struct SpriteState {
        Vector3 position;
        int width, height;
        double rotation, scaling;
    };
    std::map<int, SpriteState> stateVector;
}

次のように見えるメンバー関数を使用してSpriteStateオブジェクトを作成したいと思います。

SpriteState newSpriteState(
        Vector3 position = stateVector.rbegin()->second.position, 
        int width = = stateVector.rbegin()->second.width, 
        int height = = stateVector.rbegin()->second.height, 
        double rotation = stateVector.rbegin()->second.rotation, 
        double scaling = stateVector.rbegin()->second.scaling)
    { SpriteState a; a.position = position; a.width = width; a.height = height; a.rotation = rotation; a.scaling = scaling; return a; }

次のエラーが発生します。

非静的メンバー参照は、特定のオブジェクトに関連している必要があります

クラス自体の背後にある基本的な考え方は、スプライトのさまざまな状態を変更時に保存して、必要に応じて以前の状態に簡単に復元できるようにすることです。

ただし、ほとんどの場合、スプライトは新しい位置の値でのみ更新されますが、幅、高さ、回転、スケーリングはほとんど同じです。つまり、ポップアップして、最後に保存された状態からの参照を再度保存するときにのみ、位置の値を変更します。他の値。

したがって、同じ値を繰り返し書く必要がないように、関数のデフォルト値を設定できるようにしたいと思います。

実装に関する考えられるアイデアはありますか?

4

4 に答える 4

2

オーバーロード:

SpriteState newSpriteState(Vector3 position)
{
    return newSpriteState(
            position,
            stateVector.rbegin()->second.width, 
            stateVector.rbegin()->second.height, 
            stateVector.rbegin()->second.rotation, 
            stateVector.rbegin()->second.scaling)      
}
于 2012-12-19T11:09:42.117 に答える
2

デフォルトの引数は呼び出し元のコンテキストで評価されるため、クラスのメンバーにアクセスして「デフォルト」の値を取得する必要がある場合は、デフォルトの引数を使用できません。

一方、オーバーロードを使用して同じ効果を得ることができます。

SpriteState newSpriteState(
    Vector3 position,
    int width,
    int height,
    double rotation,
    double scaling)
{ 
    SpriteState a; 
    a.position = position; 
    a.width = width; 
    a.height = height; 
    a.rotation = rotation; 
    a.scaling = scaling; 
    return a; 
}

SpriteState newSpriteState(
    Vector3 position)
{
    return newSpriteState(position,
                          stateVector.rbegin()->second.width, 
                          stateVector.rbegin()->second.height, 
                          stateVector.rbegin()->second.rotation, 
                          stateVector.rbegin()->second.scaling);
}
/* ... And similar for additional non-default values. */
于 2012-12-19T11:24:20.597 に答える
1

SpriteStateのコピーを作成してから、変更する必要があります。

SpriteState newSpriteState(stateVector.rbegin()->second);
newSpriteState.width = someNewWidth;
return newSpriteState;

すべての構造体とクラスには、デフォルトで次の形式のコピーコンストラクタがあります。

ClassName(const ClassName&);

デフォルトでは、クラス/構造体のデータをコピーします。

于 2012-12-19T11:07:11.447 に答える
1

メンバー関数はクラスメンバーを呼び出すことができません。次のようにしてアーカイブできます。

SpriteState newSpriteState(SpriteState sprite_state)        
{ 
  SpriteState a; 
  a.position = position; 
  a.width = width; 
  a.height = height; 
  a.rotation = rotation; 
  a.scaling = scaling; 
  return a; 
}

次に、この関数を別の関数で呼び出しますmember function

newSpriteState(stateVector.rbegin()->second);
于 2012-12-19T11:52:32.903 に答える