Делегирование конструктора C ++, но как (вроде) инвертировать? - PullRequest
0 голосов
/ 19 октября 2019

Я понимаю, что в C ++ 11 делегирование конструктора может выглядеть так:

class Foo
{
 public:
  Foo()
   {
     // Some code to be ran first
   }
  Foo(std::string bar): Foo() // Runs the code to be ran first
   {
    // Some code to be ran second, presumably using bar
   }
};

Я хочу знать, как каким-то образом перевернуть эту ситуацию. А именно, в случае вызова конструктора Foo() я хочу запустить некоторый код, чтобы выяснить значение для std::string, которое затем будет использоваться Foo(std::string bar) для завершения инициализации. Таким образом, Foo() запускает как собственный код, так и код в Foo(std::string bar), тогда как последний выполняет только свой собственный код, что-то вроде

class Foo
{
 public:
  Foo()
   {
     std::string bar_figured_out;
     // Figures out the value for bar_figured_out

     Foo(bar_figured_out); // I know this wouldn't work, just an example of what I'm trying to do.
   }
  Foo(std::string bar):
   {
    // Some code to finish class initialization, using bar
   }
};

Есть ли способ выполнить это с помощью делегирования конструктора?

1 Ответ

6 голосов
/ 19 октября 2019

У вас есть две опции:

  • Переместите код из Foo(std::string bar) в функцию-член и вызовите его из Foo() и Foo(std::string bar).

  • Переместите код, который определяет значение bar_figured_out, в функцию-член, а затем Foo() вызовите эту функцию при делегировании Foo(std::string bar):

    Foo() : Foo(compute_bar()) {}
    
...