0

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

这是基本代码:

字符类

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

public:
    //All of the function declarations

字符构造器

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.
}

InvSlotFoodSlot带基本空槽的结构

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

错误

首先, and 的结构声明和构造函数定义InvSlotFoodSlot了我candidate expects 1 argument, 0 provided. 其次,实际错误在Character构造函数中的最终初始化程序上(在花括号之前):no matching function for call to 'FoodSlot::FoodSlot()'no matching function for call to 'InvSlot::InvSlot()'. 问题是,我已经初始化了花括号中的数组,它们本身并没有返回任何错误。最重要的是,这两个是字符类的仅有的两个参数,甚至使用了InvSlotorFoodSlot对象。任何人都可以帮助弄清楚发生了什么,以及如何解决它?我已经检查了其他类似的问题,但它们没有帮助。让我知道是否需要添加任何内容,或者在输入此帖子时是否遗漏了某些内容。

提前致谢!

4

2 回答 2

0

你得到的错误信息基本上是找不到默认的构造函数,显然是这样的。当你写

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

调用默认构造函数来初始化您的数组。您可以做的是为InvSlotand编写一个默认构造函数,FoodSlot它基本上返回一个空的InvSlotand FoodSlot。空我的意思是你在初始化列表中使用的对象的语义等价物(emptyInv,emptyFood)。

于 2017-03-31T04:17:55.443 回答
0

目前正在发生的事情的顺序:

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

你需要什么:

选项1

在你的头文件中:

class Character {
    InvSlot inventory[30] = {emptyInv,...,emptyInv};
    FoodSlot foodInv[10] = {emptyFood,...,emptyFood};

这可能不是最佳选择,因为您将标题弄乱了。

选项2

在构造函数的定义中:

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

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

于 2017-03-31T04:24:18.097 回答