期望缺少对其他构造函数/候选者的调用的构造函数需要1个参数,0提供?

时间:2017-03-31 03:52:23

标签: c++ function constructor candidate

你昨天可能已经看过我关于我在基于文本的冒险游戏中遇到的问题的帖子。我完成了所有修复并添加了一些功能,但是在添加一些自定义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 Structs w / Basic Empty Slots

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

错误

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

您得到的错误消息基本上是找不到默认构造函数,显然就是这种情况。当你写

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

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

答案 1 :(得分:0)

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

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

    <强>选项1

    在您的标头文件中:

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

    这可能不是最好的选择,因为你会混淆标题。

    <强>选项2

    在构造函数的定义中:

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

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