Делегирование конструкторов без инициализации - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь реализовать делегированный конструктор без инициализации.Это потому, что мне нужны соответствующие значения, полученные при вызове функции.Как написать правильный код без повторения кода?

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 Ответ

1 голос
/ 08 апреля 2019
foo(a, b, c); // ??? Does this work?

Нет, это не работает. Он создает временный объект и не может инициализировать переменные-члены текущего объекта.

Мое предложение:

Измените function_call, чтобы оно возвращало std::tuple<double, double, double> вместо обновления значений объектов, переданных по ссылке.

Затем вы можете использовать:

class foo
{
   private:

      foo(std::tuple<double, double, double> const& 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> const& arr) : foo(arr[0], arr[1], arr[2]) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...