C++ 构造函数需要缺少对其他构造函数/候选构造函数的调用,需要1个参数,是否提供了0?

C++ 构造函数需要缺少对其他构造函数/候选构造函数的调用,需要1个参数,是否提供了0?,c++,function,constructor,candidate,C++,Function,Constructor,Candidate,你可能已经看到我昨天发布的关于我在基于文本的冒险游戏中遇到的问题的帖子。我修复了所有这些问题并添加了一些功能,但在添加一些自定义插槽对象的库存数组时,我的角色对象决定停止识别它们的初始化 以下是基本代码: 字符类 class Character { InvSlot inventory[30]; FoodSlot foodInv[10]; //Declaring armor slots, class, race, stats, etc public: //All

你可能已经看到我昨天发布的关于我在基于文本的冒险游戏中遇到的问题的帖子。我修复了所有这些问题并添加了一些功能,但在添加一些自定义插槽对象的库存数组时,我的角色对象决定停止识别它们的初始化

以下是基本代码:

字符类

class Character {
    InvSlot inventory[30];
    FoodSlot foodInv[10];
    //Declaring armor slots, class, race, stats, etc

public:
    //All of the function declarations
struct InvSlot {
    bool isUsed;
    Item item;
    InvSlot(Item i);
};

struct FoodSlot {
    bool isUsed;
    Item item;
    FoodSlot(Food f);
};

InvSlot::InvSlot(Item i) : isUsed(false), item(i){}
InvSlot emptyInv = InvSlot(NoItem); //NoItem is a basic object of type Item which works

FoodSlot::FoodSlot(Food f) : isUsed(false, food(f), quantity(0){}
FoodSlot emptyFood = FoodSlot(NoFood); //Same deal with NoFood
字符构造函数

Character::Character() :
    //Initializing armor slots, class, race, stats, etc to default values
{
    InvSlot inventory[30] = {emptyInv,...,emptyInv}; //The other 28 values are omitted here.
    FoodSlot foodInv[10] = {emptyFood,...,emptyFood}; //The other 8 values are omitted here.
}
InvSlot
FoodSlot
带基本空插槽的结构

class Character {
    InvSlot inventory[30];
    FoodSlot foodInv[10];
    //Declaring armor slots, class, race, stats, etc

public:
    //All of the function declarations
struct InvSlot {
    bool isUsed;
    Item item;
    InvSlot(Item i);
};

struct FoodSlot {
    bool isUsed;
    Item item;
    FoodSlot(Food f);
};

InvSlot::InvSlot(Item i) : isUsed(false), item(i){}
InvSlot emptyInv = InvSlot(NoItem); //NoItem is a basic object of type Item which works

FoodSlot::FoodSlot(Food f) : isUsed(false, food(f), quantity(0){}
FoodSlot emptyFood = FoodSlot(NoFood); //Same deal with NoFood
错误

class Character {
    InvSlot inventory[30];
    FoodSlot foodInv[10];
    //Declaring armor slots, class, race, stats, etc

public:
    //All of the function declarations
struct InvSlot {
    bool isUsed;
    Item item;
    InvSlot(Item i);
};

struct FoodSlot {
    bool isUsed;
    Item item;
    FoodSlot(Food f);
};

InvSlot::InvSlot(Item i) : isUsed(false), item(i){}
InvSlot emptyInv = InvSlot(NoItem); //NoItem is a basic object of type Item which works

FoodSlot::FoodSlot(Food f) : isUsed(false, food(f), quantity(0){}
FoodSlot emptyFood = FoodSlot(NoFood); //Same deal with NoFood
首先,
InvSlot
FoodSlot
的结构声明和构造函数定义给了我一个
candidate expected 1参数,0提供的问题。第二,实际错误出现在
字符
构造函数中的最后一个初始值设定项上(在大括号之前):
调用'FoodSlot::FoodSlot()'时没有匹配的函数
调用'InvSlot::InvSlot()'时没有匹配的函数
。问题是,我已经初始化了大括号中的数组,它们本身没有返回任何错误。除此之外,这两个参数是字符类中仅有的两个参数,它们甚至使用
InvSlot
FoodSlot
对象。谁能帮我弄清楚发生了什么事,以及如何解决?我已经检查了其他类似的问题,但没有帮助。如果我需要添加任何内容,或者在键入此帖子时遗漏了一些内容,请告诉我


提前谢谢

您得到的错误消息基本上是找不到默认构造函数,这显然是事实。当你写作时

InvSlot inventory[30];
FoodSlot foodInv[10];

将调用默认构造函数来初始化数组。您可以做的是为
InvSlot
FoodSlot
编写一个默认构造函数,它基本上返回一个空的
InvSlot
FoodSlot
。对于empty,我的意思是在语义上等同于您在初始值设定项列表中使用的对象(emptyInv,emptyFood)

当前发生的事情的顺序:

  • (在
    main
    的某处)尝试创建
    字符的实例
  • Character
    正在创建其所有数据成员:
    inventory
    foodiv
  • 由于
    inventory
    是一个数组,因此需要调用构造函数30次,并且需要在执行
    字符的构造函数之前调用它。因为您没有向编译器提供任何要专门调用的内容,所以它将尝试调用默认构造函数。由于您已经定义了参数化构造函数,默认值已被删除
  • 您需要的:

    选项1

    在头文件中:

    class Character {
        InvSlot inventory[30] = {emptyInv,...,emptyInv};
        FoodSlot foodInv[10] = {emptyFood,...,emptyFood};
    
    这可能不是最好的选择,因为你会把标题弄得乱七八糟

    选项2

    在构造函数的定义中:

    Character::Character()
      : inventory{{emptyInv,...,emptyInv}}, foodinv{{emptyFood,...,emptyFood}}
    {
    }
    

    有趣的是,您的构造函数定义中已经有了
    符号,这意味着您首先尝试了正确的解决方案(或者您可能不知道该字符的含义)。它专门用于在字段上调用构造函数。

    InvSlot inventory[30]={emptyInv,…,emptyInv}不会做你想做的事。它没有初始化
    库存
    成员。它正在初始化一个恰好具有相同名称的局部变量。成员变量没有任何初始化,这意味着编译器尝试使用默认初始化,但它不能,因为没有接受0个参数的
    InvSlot
    构造函数。@RaymondChen那么我如何着手修复它呢?我已经尝试过在类声明中初始化它(请记住,在我的代码中,声明和定义是分开的,分别在
    Character.h
    Character.cpp
    中),但它不允许我初始化,因为C++11只支持扩展初始值设定项,我没有使用C++11,所以我不能使用扩展的初始值设定项列表。@Raskor,你知道现在是2017年了。已经有了C++11、C++14。所以你至少落后两个标准。我想您可以为
    库存
    类定义默认构造函数,然后。。。但你为什么这么做?谢谢!添加了那些默认构造函数,一切都很好。:)