#c 11
#c 11 #c 11
Вопрос:
Я пытаюсь реализовать делегированный конструктор без инициализации. Это потому, что мне нужны соответствующие значения, полученные при вызове функции. Как мне написать правильный код без повторения кода?
class foo
{
private:
// Something
public:
foo() = delete;
foo(double a, double b, double c)
{
// Something
}
foo(int n)
{
double a, b, c;
// a, b, c passed by reference and appropriate value is obtained here.
function_call(n, a, b, c);
// construct this object as if the call is foo(a, b, c) now
foo(a, b, c); // ??? Does this work?
}
};
Ответ №1:
foo(a, b, c); // ??? Does this work?
Нет, это не работает. Он создает временный объект и не может инициализировать переменные-члены текущего объекта.
Мое предложение:
Измените, function_call
чтобы возвращать std::tuple<double, double, double>
вместо обновления значений объектов, передаваемых по ссылке.
Затем вы можете использовать:
class foo
{
private:
foo(std::tuple<double, double, double> constamp; t) : foo(std::get<0>(t), std::get<1>(t), std::get<2>(t)) {}
public:
foo() = delete;
foo(double a, double b, double c)
{
// Something
}
foo(int n) : foo(function_call(n)) {}
};
Вы также можете использовать std::array<double, 3>
в качестве возвращаемого значения function_call
и соответствующим образом обновить конструктор.
foo(std::array<double, 3> constamp; arr) : foo(arr[0], arr[1], arr[2]) {}