Kal*_*ule 4 c++ constructor class
我是C++的新手,想要上课.
在我的世界里有英雄和剑.英雄携带剑.这不应该太难.
// Defining swords
class Sword
{
// The most important thing about a sword is its length.
int lenght;
public:
// only constructor and destructor
Sword(int swordlength){
lenght = swordlength;
};
~Sword(){};
};
// defining heros (as people with magic swords)
class Hero
{
Sword magic_sword;
public:
// each hero gets a standard sword
Hero(){
int meters = 2;
magic_sword = Sword(meters);
};
~Hero(){};
};
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译这段代码(g++ hero.cpp)时,我收到一个错误:
In constructor 'Hero::Hero()':
20:9: error: no matching function for call to 'Sword::Sword()'
20:9: note: candidates are:
8:3: note: Sword::Sword(int)
8:3: note: candidate expects 1 argument, 0 provided
2:7: note: constexpr Sword::Sword(const Sword&)
2:7: note: candidate expects 1 argument, 0 provided
Run Code Online (Sandbox Code Playgroud)
编译代码clang++也失败了,但错误信息并不明确,所以我不会在这里发布.
似乎调用构造函数Sword(meters)失败,因为我提供了0而不是1参数.但是我明确地给了它一个参数(meters),所以我想我在这里误解了一些东西.
我的错是什么,我能做些什么呢?
你Hero总是有一个Sword.
这意味着,在实例化类的那一刻,在Hero::Hero构造函数开始运行之前,它必须具有"默认" Sword.编译器抱怨它不知道如何制作这样的"默认" Sword.
现在,有多种方法可以解决这个问题:
在构造函数的定义,你可以指定如何你的对象的成员应该被初始化(之前实际运行的构造函数).这与在构造函数体中为它们分配新值(在您的示例中发生)不同.为此,:在构造函数的签名后跟成员字段初始值设定项后指定冒号(),如下所示:
Hero() : magic_sword(2)
{
// do other stuff to set up your hero
}
Run Code Online (Sandbox Code Playgroud)
这将导致magic_sword使用Sword::Sword(int)构造函数立即初始化,这意味着您不需要具有默认Sword::Sword()构造函数.
阅读更多:了解C++中的初始化列表
你真的希望你Sword的属于你的Hero吗?你Hero可以放弃一个Sword,然后另一个Hero拿起它吗?
在这种情况下,你可能不希望你Hero有一个Sword作为成员-相反,你会想要一个指针到Sword他是目前持有-那么它也许可以是nullptr如果他是,例如,不是拿着一把剑!