2012-06-08 16 views
9

基本的には、スプライトのアクティブなアニメーションへの参照を、Actorクラスのプライベートメンバとして保存します。参照を使用してアニメーションを複数回作成する必要はありませんが、エラーが発生します。初期化されていない参照メンバ

Actorクラスの宣言:

class Actor 
{ 
public: 
     Actor(); 
     ~Actor(); 
     void setActiveAnimation(Animation anim); 
     void draw(sf::RenderWindow& win); 

private: 
     sf::Sprite sprite; 
     MaJR::Animation& activeAnimation; 
}; 

俳優クラスの実装:

Actor::Actor() 
{ 
    // constructor 
} 

Actor::~Actor() 
{ 
    // destructor 
} 

void Actor::setActiveAnimation(Animation anim) 
{ 
    activeAnimation = anim; 
    activeAnimation.gotoStart(); 
} 

void Actor::draw(sf::RenderWindow& win) 
{ 
    sprite.setTexture(activeAnimation.getActiveFrame()); 
    win.draw(sprite); 
    activeAnimation.nextFrame(); 
} 

ビルド出力:

/home/mike/MaJR Game Engine/src/Actor.cpp||In constructor 'MaJR::Actor::Actor()':| 
/home/mike/MaJR Game Engine/src/Actor.cpp|8|error: uninitialized reference member 'MaJR::Actor::activeAnimation' [-fpermissive]| 
||=== Build finished: 1 errors, 0 warnings ===| 

答えて

18

参照がを再割り当てすることはできませんので、それは時に初期化する必要がありますメンバー初期化リスト。しかし、あなたはあなたが欲しいものが参照ではないので、それを再割り当てするつもりです。さらに、setActiveAnimation関数では、引数として渡された値のコピーへの参照を設定しています。そのため、コードが関数を終了するときに無効な参照が残されます。おそらくポインタがあなたに合っていますか?あなたが定義時に参照をバインドする必要があり

void Actor::setActiveAnimation(Animation* anim) 
{ 
    activeAnimation = anim; 
    activeAnimation->gotoStart(); 
} 
+3

あなたの分析は良いですが、私は参照渡しのパラメータのアドレスを格納するコードで答えをupvoteできません。後で使用するためにポインタを格納する場合は、ポインタパラメータを受け入れて、呼び出し元にライフタイムの考慮事項を認識させます。 –

+0

@Ben Voigt:私のコードで_ _ポインタを使用しないでください。 –

+1

生ポインタがスマートポインタほど良くないことに同意します。しかし、参照ははるかに悪いです。 +1の修正。 –

1

MaJR::Animation* activeAnimation; 

そしてsetActiveAnimation機能:クラス本体で

。メンバ参照の場合、これはコンストラクタの初期化子リストにあることを意味します。さらに、宣言後にバインディングを再割り当てすることはできません。

Actorのオブジェクトの時刻にオブジェクトを持っていない場合は、後で必要に応じて再割り当てできるポインタを使用することをお勧めします。

6

クラスにメンバーがある場合は、そのメンバーをコンストラクターで初期化する必要があります。一度初期化されると、それ以上は変更できません(値を変更することはできますが、参照先は変更できません)。

代わりにactiveAnimationをポインタにします。

2

初期化されていない参照を宣言することはできません。つまり、クラスActorからオブジェクトを作成するときに参照を初期化する必要があるか、参照を使用できません。動的に変更する必要がある場合は、スマートポインタ(たとえば、std::unique_ptrshared_ptr)などのポインタを使用できます。 C++ 11を使用できない場合は、Boostのsmart pointersをご覧ください。

関連する問題