Как переслать перегруженный вызов конструктора другому конструктору в 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;
};