どのように過積載のコンストラクタの呼別のコンストラクタはC++/CLIを起動します。

StackOverflow https://stackoverflow.com/questions/2357076

質問

知っていることを制限することはないと思うこ 純粋なC++, が破壊も修復もおもしろくない呼び出すことはできコンストラクタから別のコンストラクタの初期化リストのC++/CLI、そういうことではないでクライアントまで、フルのC#.

例:

ref class Foo {
  Foo() {}
  Foo(int i) : Foo() {}
}
役に立ちましたか?

解決

と呼ばれている"委託のコンストラクタ".ご利用になれませんので、言語はまだない。が正式な提案にてご利用いただける附属書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 ++でそれを行うことが可能です。あなたがそうするように配置new演算子を使用することができます。

class A 
{ 

public:

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

   A() : p(1) {}      

   int p; 
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top