编译器无法看到参数

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),所以我想我在这里误解了一些东西.

我的错是什么,我能做些什么呢?

Tre*_*ton 7

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如果他是,例如,不是拿着一把剑!