基本上我想要做的是将对精灵的活动动画的引用存储为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 ===|
答案 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_ptr,shared_ptr)。如果您不能使用C ++ 11,那么请查看Boost中的smart pointers。
答案 3 :(得分:1)
您需要在定义时绑定引用。对于成员引用,这意味着在构造函数的初始化列表中。此外,声明后不能重新分配绑定。
如果在Actor
个对象的实例化时没有对象(获取引用),那么下一个最好的选择是使用可以根据需要稍后重新分配的指针。