Как переслать перегруженный вызов конструктора другому конструктору в C++/CLI

Я знаю, что нет никакого способа сделать это в чистом C++, но мне было интересно, можно ли вызвать конструктор из списка инициализации другого конструктора в C++/CLI, так же, как это можно сделать в C#.

Пример:

ref class Foo {
  Foo() {}
  Foo(int i) : Foo() {}
}

4 ответа

Решение

Это называется "делегирующий конструктор". Это еще не доступно на языке. Но есть формальное предложение, вы найдете его в приложении F.3.1 спецификации языка. Учитывая позицию Microsoft по отношению к C++/CLI, это вряд ли увидит свет в ближайшее время.


ОБНОВЛЕНИЕ: делегирующие конструкторы имели жизнь вне предложения в том приложении, они были добавлены к стандартной спецификации языка C++ 11. Microsoft работает над реализацией дополнений C++ 11. Делегированные конструкторы наконец сделали это для VS2013. И они также работают на C++ / CLI в этой редакции.

Вы можете сделать следующее

ref class A
{
public:
    A(int p) : p(p) { this->A::A(); }
    A() : p(1) {}

    int p;
};

Это не правильный код C++, но VC прекрасно его компилирует:)

Просто наткнулся, на тот же вопрос. В моем случае я использую VS2010.

Ясно, что VS2010 никогда не будет обновляться для полной реализации C++11, используйте VS2015, если вам нужно лучшее соответствие стандарту (что я делаю, когда могу). Но для некоторых (унаследованных) проектов мне все еще приходится использовать VS2010.

Подход, который работает во многих случаях (для меня), заключается в использовании закрытой функции со всем общим кодом инициализации в ней. Пример:

class A
{
private:
    void Inidialise() { /* common initialisation here */ }

public:
    A()       { Initialise(); /* specific initialisation for A() here */ }
    A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ }
    A(int b)  { Initialise(); /* specific initialisation for A(int) here */ }

    /* etcetera */

}

Он не решает все "проблемы" и не предотвращает все случаи дублирования кода, но имеет большое значение.

Когда вы сказали: "Я знаю, что на чистом C++ это сделать невозможно", вы ошиблись. Это можно сделать на родном C++. Вы можете использовать новый оператор размещения для этого.

class A 
{ 

public:

   A(int p) : p(p) 
   { new(this)A(); }

   A() : p(1) {}      

   int p; 
};
Другие вопросы по тегам