純粋なC++でこれを行う方法がないことは知っていますが、C#で行うのと同じ方法で、C ++/CLIで別のコンストラクターの初期化リストからコンストラクターを呼び出すことができるかどうか疑問に思いました。
例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
純粋なC++でこれを行う方法がないことは知っていますが、C#で行うのと同じ方法で、C ++/CLIで別のコンストラクターの初期化リストからコンストラクターを呼び出すことができるかどうか疑問に思いました。
例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
これは「委任コンストラクター」と呼ばれます。その言語ではまだ利用できません。しかし、正式な提案があります。それは、言語仕様の付録F.3.1にあります。C ++ / CLIに対するMicrosoftの姿勢を考えると、それがすぐに日の目を見ることはありそうにありません。
更新:委任コンストラクターは、その付録の提案を超えた寿命を持っていました。それらは、標準の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;
};