Делегирование конструкторов без инициализации

#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]) {}