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 回答