未初始化的参考成员

时间:2012-06-08 21:17:26

标签: c++

基本上我想要做的是将对精灵的活动动画的引用存储为Actor类中的私有成员。我想使用一个引用,所以我不必多次实际创建动画,但我一直收到错误。

演员类声明:

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

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

Actor类实现:

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 个答案:

答案 0 :(得分:23)

引用不能重新分配,因此必须在 member-initialization-list 中初始化它。但是,您打算重新分配它,所以您想要的不是参考。更重要的是,在setActiveAnimation函数中,您正在设置对作为参数传递的值的副本的引用,这会在代码退出函数时留下无效引用。也许指针适合你?

在课堂上:

MaJR::Animation* activeAnimation;

setActiveAnimation函数:

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

答案 1 :(得分:7)

如果您的类中有成员是引用,则必须在构造函数中初始化它。一旦它被初始化,你就不能再改变它了(你可以改变它而不是它所指的位置)。

将activeAnimation改为指针。

答案 2 :(得分:2)

您无法声明未初始化的引用。这意味着您需要在从类Actor创建对象时初始化引用,或者您不能使用引用。如果您需要动态更改它,那么您可以使用指针,或者更好的是,使用智能指针(例如,std::unique_ptrshared_ptr)。如果您不能使用C ++ 11,那么请查看Boost中的smart pointers

答案 3 :(得分:1)

您需要在定义时绑定引用。对于成员引用,这意味着在构造函数的初始化列表中。此外,声明后不能重新分配绑定。

如果在Actor个对象的实例化时没有对象(获取引用),那么下一个最好的选择是使用可以根据需要稍后重新分配的指针。