19

基本的に私がやりたいのは、スプライトのアクティブなアニメーションへの参照を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 ===|
4

4 に答える 4

30

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

クラス本体で:

MaJR::Animation* activeAnimation;

そしてsetActiveAnimation機能:

void Actor::setActiveAnimation(Animation* anim)
{
    activeAnimation = anim;
    activeAnimation->gotoStart();
}
于 2012-06-08T21:19:37.610 に答える
7

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

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

于 2012-06-08T21:20:36.113 に答える
3

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

于 2012-06-08T21:21:44.657 に答える
2

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

オブジェクトのインスタンス化時に (参照を取得するための) オブジェクトを持っていない場合Actor、次の最善の策は、必要に応じて後で再割り当てできるポインターを使用することです。

于 2012-06-08T21:19:59.467 に答える