Ошибка добавления n enum пространства имен внутри структуры - PullRequest
0 голосов
/ 20 апреля 2020

У меня ошибка при добавлении параметра класса внутри структуры. Я не знаю почему, но вставка простой переменной типа namespace :: enum с static_cast не приводит к ошибке. Я пытаюсь вставить все свои перечисления в вектор структуры

код пространства имен

namespace plazza {
    enum Ingredients {
        Doe,
        Tomato, 
        Gruyere,
        Ham
    };
}

Структура

typedef struct s_stock {
    plazza::Ingredients ingredient;
    int quantity;
} t_stock;

Класс

class Kitchen {
public:
    Kitchen(int multiplier, int numCooks, int cookingTime);
    ~Kitchen();
private:
    int _multiplier;
    int _numCooks;
    int _cookingTime;
    std::vector<t_stock> _stock;
    plazza::Ingredients ginger;
};

Код

Kitchen::Kitchen(int multiplier, int numCooks, int cookingTime) {
    _multiplier = multiplier;
    _numCooks = numCooks;
    _cookingTime = cookingTime;
    // How I think it should be
    _stock[0].ingredient = plazza::Doe;
    // No error
    ingre = static_cast<plazza::Ingredients>(plazza::Ingredients::Doe);
    // what I try but error
    _stock[0].ingredient = static_cast<plazza::Ingredients>(plazza::Ingredients::Doe);

}

Ошибка добавления в вектор структуры

==7692== Invalid write of size 4
==7692==    at 0x110A7E: Kitchen::Kitchen(int, int, int) (in /home/jonathangomez/epitech/2/ccp/CCP_plazza_2019/plazza)
==7692==    by 0x10CE96: Reception::time_to_work() (in /home/jonathangomez/epitech/2/ccp/CCP_plazza_2019/plazza)
==7692==    by 0x10C16B: main (in /home/jonathangomez/epitech/2/ccp/CCP_plazza_2019/plazza)
==7692==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

1 Ответ

1 голос
/ 20 апреля 2020

Вы присваиваете значение _stocks [0], но сначала вы не определяете размер вектора, чтобы он содержал хотя бы один элемент. Либо используйте push_back , либо используйте список инициализации, чтобы инициализировать ваш вектор при построении.

Чтобы назначить что-то для t_stock, вы можете использовать

t_stock dummy = { plazza::Doe /* first argument in struct is the ingredient */, 1 /*second argument in the struct is the quantity */ }

Комбинированный, чтобы правильно назначить все в конструкторе вашей кухни, вы можете использовать:

Kitchen::Kitchen(int multiplier, int numCooks, int cookingTime)
: _multiplier(multiplier), 
  _numCooks(numCooks), 
  _cookingTime(cookingTime), 
  _stock({ {plazza::Doe, 1} }) // Initialize vector with one element
{
}

Чтобы добавить При создании нескольких элементов вы можете сделать:

Kitchen::Kitchen(int multiplier, int numCooks, int cookingTime)
: _multiplier(multiplier), 
  _numCooks(numCooks), 
  _cookingTime(cookingTime), 
  _stock({ {plazza::Doe, 1}, {plazza::Tomato, 4} }) // Initialize vector with two elements
{
}

Чтобы добавить новые элементы запаса после создания, всегда используйте push_back

_stock.push_back({plazzo::Gruyere, 16}); // Add lots of 'em
...