在不应该调用时调用默认构造函数
Default constructer being called when it's not supposed to
所以我已经设法将我的问题缩小到这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(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)
{
....
}
这里的问题是,你需要弄清楚如何应对_animObj
是NULL
的情况。如果不能是NULL
,最好传递一个引用:
PlayerObject::PlayerObject(const AnimatedObject& _animObj) : anim(_animObj)
{
....
}
否则,您必须找出所需的语义并实现它们。
还要注意,以_
开头的名称在某些上下文中是保留的,因此最好不要使用它们。
必须在初始化列表中初始化anim
。否则它会先被默认构造。所以,像这样:
PlayerObject::PlayerObject(AnimatedObject* _animObj) :
anim(*_animObj)
{
//snip
}
对于所有的对象成员变量都应该这样做,以避免它们首先被默认构造,然后被赋值。对于像基本类型和指针这样的东西,你做什么并不重要,但我认为大多数c++程序员都希望在初始化列表中初始化所有的成员变量,除了那些你做想要调用默认构造函数的地方,除了不实用的地方(比如你的那些数组)。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素