在不应该调用时调用默认构造函数

Default constructer being called when it's not supposed to

本文关键字:调用 构造函数 默认 不应该      更新时间:2023-10-16

所以我已经设法将我的问题缩小到这6行代码:

sf::Sprite charSpr;
charSpr.setTexture(charTex);
int _characterSets[] = {1, 8, 8};
AnimatedObject characterObj(&charSpr, 51, 75, 3, _characterSets);
PlayerObject character(&characterObj);

不知怎么的,通过这些行,它总是来传递默认构造函数被AnimatedObject类调用,即使我清楚地只调用AnimatedObject的构造函数,它接受一个sf::sprite,两个int和一个int数组。

PlayerObject构造函数
PlayerObject::PlayerObject(AnimatedObject* _animObj){
    anim = *_animObj;
    dynamic = false;
    for(int i = 0; i < 2; i++){
        position[i] = 0;
        velocity[i] = 0;
        acceleration[i] = 0;
        gravity[i] = 0;
    }
}

AnimatedObject构造函数
AnimatedObject::AnimatedObject(sf::Sprite* _s, int _w, int _h, int _st, int _fs[]){
    sprite = *_s;
    width = _w;
    height = _h;
    sets = _st;
    set = 1;
    frames.insert(frames.end(), &_fs[0], &_fs[sets]);
    frame = 1;
}

AnimatedObject默认构造函数为私有的错误信息

In file included from PlayerObject.cpp:3:0:
AnimatedObject.hpp: In constructor ‘PlayerObject::PlayerObject()’:
AnimatedObject.hpp:9:3: error: ‘AnimatedObject::AnimatedObject()’ is private
   AnimatedObject();
   ^
PlayerObject.cpp:6:28: error: within this context
 PlayerObject::PlayerObject(){
                            ^
In file included from PlayerObject.cpp:3:0:
AnimatedObject.hpp: In constructor ‘PlayerObject::PlayerObject(AnimatedObject*)’:
AnimatedObject.hpp:9:3: error: ‘AnimatedObject::AnimatedObject()’ is private
   AnimatedObject();
   ^
PlayerObject.cpp:13:52: error: within this context
 PlayerObject::PlayerObject(AnimatedObject* _animObj){

初始化 anim。目前,您是在被默认构造之后为其赋值。您需要使用构造函数初始化列表来显式初始化数据成员,否则它们将被默认初始化:

PlayerObject::PlayerObject(AnimatedObject* _animObj) : anim(*_animObj)
{
  ....
}

这里的问题是,你需要弄清楚如何应对_animObjNULL的情况。如果不能是NULL,最好传递一个引用:

PlayerObject::PlayerObject(const AnimatedObject& _animObj) : anim(_animObj)
{
  ....
}

否则,您必须找出所需的语义并实现它们。

还要注意,以_开头的名称在某些上下文中是保留的,因此最好不要使用它们。

必须在初始化列表中初始化anim。否则它会先被默认构造。所以,像这样:

PlayerObject::PlayerObject(AnimatedObject* _animObj) :
    anim(*_animObj)
{
    //snip
}

对于所有的对象成员变量都应该这样做,以避免它们首先被默认构造,然后被赋值。对于像基本类型和指针这样的东西,你做什么并不重要,但我认为大多数c++程序员都希望在初始化列表中初始化所有的成员变量,除了那些你想要调用默认构造函数的地方,除了不实用的地方(比如你的那些数组)。