gpt4 book ai didi

c++ - 编译器看不到参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:26 25 4
gpt4 key购买 nike

我是 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;
}

编译器是怎么想的

当我编译此代码 (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

我认为问题是什么

clang++编译代码也失败了,但是报错信息不是很明确,这里就不贴了。

调用构造函数 Sword(meters) 似乎失败了,因为我提供了 0 个参数而不是 1 个参数。但我显然给了它一个参数 (meters),所以我想我在这里误解了一些东西。

我的错误是什么,我该怎么办?

最佳答案

您的英雄总是有一把

这意味着,在类被实例化的那一刻,在 Hero::Hero 构造函数开始运行之前,它已经有一个“默认”的 Sword。编译器提示它不知道如何制作这样一个“默认”Sword

现在,您可以通过多种方式解决此问题:

使用初始化列表

在构造函数的定义中,您可以指定如何对象的成员应该初始化(实际构造函数运行之前)。这不同于在构造函数的主体中分配它们一个新值(这发生在您的示例中)。为此,在构造函数的签名后指定一个冒号 (:),然后是成员字段初始值设定项,如下所示:

Hero() : magic_sword(2)
{
// do other stuff to set up your hero
}

这将导致 magic_sword 立即使用 Sword::Sword(int) 构造函数进行初始化,这意味着您不需要默认 Sword::Sword() 构造函数。

阅读更多:Understanding Initialization Lists in C++

使用指针

您真的希望您的Sword 只属于您的Hero 吗?您的 Hero 是否可以放下一把 Sword,然后另一个 Hero 捡起它?

在这种情况下,您可能不希望您的 Hero 拥有 Sword 作为成员 - 相反,您想要一个 pointer 到他当前持有的 Sword - 如果他没有持有剑,则可能是 nullptr!

关于c++ - 编译器看不到参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com