Я работаю над своим средним классом. Мне нужно инициализировать постоянный массив объектов, которые принимают вектор как конструктор 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)};
Может ли что-то вроде этого помочь:
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) {}
};
Ваши инициализации будут работать с этим.
Это сработало для меня:
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}), };
Вы можете определить конструктор для 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{}}}
};
}
Pizza
берет initializer_list
(и, возможно, пару итераторов), вы можете сэкономить много печатать. Несмотря на это, многое из того, что у вас есть, является излишним.
Pizza standardMenu[2] = {{1,2,3},{4,5,6}};
+std::make_unique
?