Конструктор, ожидающий пропущенного вызова другого конструктора / кандидата, ожидает 1 аргумент, 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.
}

InvSlot а также FoodSlot Структуры с основными пустыми слотами

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 expects 1 argument, 0 provided, Во-вторых, фактические ошибки находятся на окончательном инициализаторе в Character конструктор (перед фигурными скобками): no matching function for call to 'FoodSlot::FoodSlot()' а также no matching function for call to 'InvSlot::InvSlot()', Дело в том, что я уже инициализировал массивы в фигурных скобках, и они сами не возвращают никаких ошибок. Кроме того, эти два являются единственными двумя параметрами для класса символов, которые даже используют InvSlot или же FoodSlot объекты. Кто-нибудь может помочь разобраться, что происходит и как это исправить? Я уже проверил другие подобные вопросы, но они не помогли. Дайте мне знать, если мне нужно что-то добавить или я что-то пропустил при наборе этого поста.

Заранее спасибо!

0

Решение

Вы получаете сообщение об ошибке, в основном, о том, что конструктор по умолчанию не может быть найден, что, очевидно, имеет место. Когда ты пишешь

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

конструктор по умолчанию вызывается для инициализации ваших массивов. Что вы можете сделать, это написать конструктор по умолчанию для InvSlot а также FoodSlot которые в основном возвращают пустое InvSlot а также FoodSlot, Под пустым я подразумеваю семантически эквивалентный объект, который вы использовали в вашем списке инициализатора (emptyInv, emptyFood).

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

Это, вероятно, не лучший вариант, так как вы загромождаете заголовок.

Option2

В определении вашего конструктора:

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

Самое смешное, что у вас уже есть : символ в определении конструктора, означающий, что вы сначала попытались найти правильное решение (или, возможно, вы не знали о значении этого символа). Именно там специально вызывать конструкторов на полях.

0