C ++ передать новый экземпляр вектора

0

Я работаю над своим средним классом. Мне нужно инициализировать постоянный массив объектов, которые принимают вектор как конструктор args. В принципе, я хочу сделать что-то похожее на следующий код Java:

final Pizza[] standardMenu = {
    new Pizza(Arrays.asList(new Integer(1), new Integer(2), new Integer(3))),
    new Pizza(Arrays.asList(new Integer(4), new Integer(5), new Integer(6)))};

За исключением экземпляров Integer, я бы передал экземпляры Ingredient. Есть ли способ сделать что-то подобное в C++? Как моя книга, так и быстрый поиск в Google не дали никаких хороших результатов.

Код Im, смотрящий прямо сейчас (C++):

Ingredient standardIngredients[8] = {Ingredient("American Cheese", "Cheese that comes from America", 1.0), Ingredient("Swiss Cheese", "Cheese that is Swiss", 1.0),
                    Ingredient("Peperoni", "Does it need a description?", 2.0), Ingredient("Ground Beef", "Ground up beef", 3.0),
                    Ingredient("Onion", "Its a vegetable", 0.5), Ingredient("Black Olives", "Olives that possess the color of blackness", 0.5),
                    Ingredient("Jalapenios", "Spicy things", 0.5), Ingredient("Pickles", "Just because I can", 0.5)};
Pizza standardMenu[1] = {Pizza({standardIngredients[0], standardIngredients[1]}, "A string", 7.8)};
  • 1
    Покажите нам, что вы пытались, пожалуйста.
  • 0
    Pizza standardMenu[2] = {{1,2,3},{4,5,6}}; + std::make_unique ?
Показать ещё 4 комментария
Теги:
arrays
arguments

3 ответа

0

Может ли что-то вроде этого помочь:

typedef vector<string> Pizza; 
auto menu = vector<Pizza>{ Pizza{ "chorizo", "tomato", "pepperoni" }, 
                           Pizza{ "Ananas", "Ham" } };

или если вы предпочитаете свое меню в виде массива:

Pizza menu[] = { Pizza{ "chorizo", "tomato", "pepperoni" }, Pizza{ "Ananas", "Ham" } };

Конечно, это первый шаг, потому что в этой модели пицца - это всего лишь сумма ее частей. Было бы лучше иметь выделенный класс, если вы хотите добавить дополнительную информацию, такую как цена на пиццу, калории и т.д....

Редактировать:

Следуя вашей дополнительной информации, я предлагаю следующие классы:

class Ingredient {
    string name;
    string description;
    double price;
public:
    Ingredient(string n, string d, double p) : name(n), description(d), price(p) {}
};
class Pizza {
    vector<Ingredient> ingredients; 
    string name; 
    double price; 
public:
    Pizza(vector<Ingredient>i, string n, double p) : ingredients(i), name(n), price(p) {}
};

Ваши инициализации будут работать с этим.

  • 0
    Да, это в основном то, что я делаю. Разница лишь в том, что я собираюсь хранить ингредиенты в виде целых, поскольку существует их неизменный список.
  • 0
    Единственное, что я не могу выяснить с вашим решением, как и со многими другими, - это почему я продолжаю получать ошибку типа Имя не допускается, когда я пытаюсь создать экземпляр массива меню?
Показать ещё 6 комментариев
0

Это сработало для меня:

class Pizza
{
private:
    std::vector<int> m_members;
public:
    Pizza(std::vector<int> &members) : m_members(members)
    {

    }
};

const Pizza pizzaArray[] = { Pizza(std::vector<int>{1, 2, 3}),
                             Pizza(std::vector<int>{4, 5, 6}), };
  • 0
    Что является частью: m_members (members) в вашем конструкторе? Можете ли вы дать немного объяснения или ссылку, где это задокументировано?
  • 0
    Это то же самое, что и "m_members = members".
Показать ещё 2 комментария
0

Вы можете определить конструктор для Pizza, который принимает вектор Ingredient в качестве аргумента, или определите initializer_list для Pizza, чтобы сохранить немного ввода.

Также обратите внимание на использование std :: array. Вы больше не должны массивы C-стиля, контейнеры STL имеют приятные вещи, такие как помнить их размер.

#include <iostream>
#include <vector>
#include <array>
#include <initializer_list>

using namespace std;

class Ingredient {};
class Pizza {
public:
    Pizza(initializer_list<Ingredient> l) : ing{l} {}
    Pizza(vector<Ingredient> l) : ing{l} {}
private:
    vector<Ingredient> ing;
};

int main()
{
    const array<Pizza, 3> pizzas1 {
        Pizza{Ingredient{}, Ingredient{}, Ingredient{}},
        Pizza{Ingredient{}, Ingredient{}, Ingredient{}},
        Pizza{Ingredient{}, Ingredient{}, Ingredient{}}
    };

    const array<Pizza, 3> pizzas2 {
        Pizza{vector<Ingredient>{Ingredient{}}},
        Pizza{vector<Ingredient>{Ingredient{}}},
        Pizza{vector<Ingredient>{Ingredient{}}}
    };

}
  • 0
    Если Pizza берет initializer_list (и, возможно, пару итераторов), вы можете сэкономить много печатать. Несмотря на это, многое из того, что у вас есть, является излишним.
  • 0
    кажется конструктор никогда не вызывается в вашем коде? или я не прав?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню