Возможно, вы видели мой пост вчера о проблемах, которые у меня были с моей текстовой приключенческой игрой. Я исправил все это и добавил некоторые функциональные возможности, но при добавлении некоторых инвентарных массивов пользовательских объектов 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
объекты. Кто-нибудь может помочь разобраться, что происходит и как это исправить? Я уже проверил другие подобные вопросы, но они не помогли. Дайте мне знать, если мне нужно что-то добавить или я что-то пропустил при наборе этого поста.
Заранее спасибо!
Вы получаете сообщение об ошибке, в основном, о том, что конструктор по умолчанию не может быть найден, что, очевидно, имеет место. Когда ты пишешь
InvSlot inventory[30];
FoodSlot foodInv[10];
конструктор по умолчанию вызывается для инициализации ваших массивов. Что вы можете сделать, это написать конструктор по умолчанию для InvSlot
а также FoodSlot
которые в основном возвращают пустое InvSlot
а также FoodSlot
, Под пустым я подразумеваю семантически эквивалентный объект, который вы использовали в вашем списке инициализатора (emptyInv, emptyFood).
Последовательность того, что происходит в данный момент:
main
) Попытка создать экземпляр Character
,Character
создает все свои элементы данных: inventory
а также foodInv
,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}}
{
}
Самое смешное, что у вас уже есть :
символ в определении конструктора, означающий, что вы сначала попытались найти правильное решение (или, возможно, вы не знали о значении этого символа). Именно там специально вызывать конструкторов на полях.