#include <iostream>
struct Test
{
int i1;
int i2;
protected:
int i3;
public:
int getI3() const
{
// ...
}
void setI3( int vi3 )
{
i3 = vi3;
}
};
int main()
{
Test t{ 1, 2, 3 };
// Test t = { 1, 2, 3 };
std::cout << t.i1 << ", " << t.i2 << "\n";
return 0;
}
Он, само собой, не собирается. Что я хочу — я хочу, чтобы при различных комбинациях i1/i2/i3 метод getI3() возвращал либо сам i3, либо результат каких-либо вычислений. Поэтому я сделал это поле защищенным.
Но — я хочу забить какой-то конфиг из map of map'ов с листами Test'а, в тч и чтобы i3 был в некоторых случаях инициализирован не по дефолту. В рантайме я этот конфиг могу обновить, а могу и использовать, как есть. Для этого удобен синтаксис initializer_list'а. При этом чего-то лищнего писать особо не хочется.
Что-то не пойму, как такое провернуть
ЗЫ А чего, http://ideone.com/ — ффсё? Давно не заходил туда, это он от СВО поломался?
M>а) без лишней писанины уже не получается
Ну, а как ты хотел.
M>б) не надо ли тогда и другие конструкторы описывать хотя бы как = default?
Смотри сам как объекты используются.
Re[4]: Инициализация через initializer_list и protected/priv
Test (int vi1, int vi2, int vi3){ i1 = vi1; i2 = vi2; i3 = vi3; }
M>>а) без лишней писанины уже не получается M>>б) не надо ли тогда и другие конструкторы описывать хотя бы как = default?
R>Так добавь значения по умолчанию к формальным параметрам конструктора и инициализация получится по форме очень похожа на агрегатную:
Вопрос в том, что не надо ли на всякий случай все конструкторы выписывать
Здравствуйте, Marty, Вы писали:
M>Вопрос в том, что не надо ли на всякий случай все конструкторы выписывать
В этом нет нужды (если основываться лишь на примере). Единственный определенный пользователем конструктор одновременно является и конструктором по умолчанию. Все остальные специальные функции-члены (конструкторы, деструктор и операторы присваивания) по-прежнему генерируются компилятором.
P.S. Это в том случае, когда пользователь определяет какую-нибудь специальную функцию-член (например, конструктор перемещения или копирования), тогда он может скрывать другие специальные функции-члены или делать их удаленными и может потребоваться определить их дополнительно. А определенный пользователем дефолтный конструктор никак не влияет на другие функции-члены, поэтому прописывать их явно нет необходимости, если сгенерированный компилятором вариант устраивает, разумеется.
Ну и помимо этого существуют еще и заповеди типа: "если вы определили конструктор копирования, то определите также и копирующий оператор присваивания" и т.п. Но все это не имеет отношения к случаю, описанному в твоем примере.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Marty, Вы писали:
M>Для этого удобен синтаксис initializer_list'а. При этом чего-то лищнего писать особо не хочется. M>Что-то не пойму, как такое провернуть
Test(const std::initializer_list<int> &init)
{
if (init.size() < 3)
throw std::out_of_range("Invalid size of initializer list.\n");
auto it = init.begin();
i1 = *it;
i2 = *(++it);
i3 = *(++it);
}
Re: Можно через protected/private наследование от структур с
Здравствуйте, AleksandrN, Вы писали:
AN>Здравствуйте, Marty, Вы писали:
M>>Для этого удобен синтаксис initializer_list'а. При этом чего-то лищнего писать особо не хочется. M>>Что-то не пойму, как такое провернуть
AN>
AN> Test(const std::initializer_list<int> &init)
AN> {
AN> if (init.size() < 3)
AN> throw std::out_of_range("Invalid size of initializer list.\n");
AN> auto it = init.begin();
AN> i1 = *it;
AN> i2 = *(++it);
AN> i3 = *(++it);
AN> }
AN>
А если свойства разных типов?
Re[2]: Можно через protected/private наследование от структур со свойствами по г