2011-10-05 14 views
12

OOPの礎石の1つは、何度も繰り返す代わりにコードを再利用することです。したがって、プロジェクトは短縮され、より読みやすくなります。再利用可能なコンストラクタC++

C++では、コードを繰り返す代わりに、メソッドを再利用するために必要なすべてのツールが用意されています。コンストラクタに関しては、それらを再利用する方法はわかりませんが。

私はではありません。父親に伝える伝承や伝言方法。私はクラスそのもののコンストラクタの再利用について話しています。

JAVAにおけるアナロジーはこのようなものです:私の質問がある

public Foo() { 
    this(0,0,0);//Not needed in this case, just to clarify 
} 

public Foo(Foo f){ 
    this(f.getA(), f.getB(), f.getC()); 
} 

public Foo(int a, int b, int c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

、あなたがそうすることを可能にするC++のいずれかのsyntaxisはありますか?

答えて

8

This is possible with recently published C++11しかし、C++コンパイラはまだこの機能を実装していません。

+0

しかし、あなたの簡単な場合には、簡単な解決策を持っています。私が知る限り、それは例えばラムダよりも多くの人生を変えるものではないので、優先順位は低いと考えられています。もちろん、Clangとgccの両方がオープンソースであると本当に思っていれば便利です:) –

+0

この回答は更新を使用する可能性があります。 –

6

C++ 11はコンストラクタの委譲とコンストラクタの継承を追加しました。あなたはそれをサポートするコンパイラを取得する必要があります。コンストラクタを継承する

、宣言を使用して、が必要とされている:

class Base { ... }; 

class Derived : public Base 
{ 
    using Base::Base; 
}; 

、委任CTOR-初期化子を使用し、同じクラスの別のコンストラクタを指定し、代わりに任意のサブオブジェクトのために(全基本サブジェクトとメンバサブオブジェクトは、委譲されたコンストラクタによって初期化されます)。

class Another : public Base 
{ 
    int member; 
    Another(int x) 
     : Base(), member(x) // non-delegating constructor initializes sub-objects 
    {} 


    Another(void) 
     : Another(5) // delegates -- other constructor takes care of Base and member 
    {} 
}; 

また、完璧な転送も便利です。

+1

これは現在普及しているはずです。恐らく受け入れられた答えになるはずです... – moodboom

11

他の人はすでにC++ 11については答えていますが、C++ 03では回避策があります:必要なコンストラクタを持つ基本クラスを使用しています。

struct foo_base { 
    foo_base(int a, int b, int c) : a(a), b(b), c(c) { } 
    int a, b, c; 
}; 

struct foo : foo_base { 
    foo() : foo_base(0, 0, 0) { } 
    foo(const foo& other) : foo_base(other.a, other.b, other.c) { } 
    foo(int a, int b, int c) : foo_base(a, b, c) { } 
}; 

もちろん、あなたの目的のために定型句の価値があるかどうかを検討する必要があります。現在のコンパイラの

+2

+1は、既存のコンパイラで解決策を指摘しています。 –

+1

+1私は決める前に書いたことを書いたものを書いています。 –

2

一般的に受け入れられてsoultionはこれを行うことです。

class Bar{ 
pubilc:  
Foo() { 
    init(0,0,0); 
} 

Foo(const Foo &f){ 
    init(f.getA(), f.getB(), f.getC()); 
} 

Foo(int a, int b, int c) { 
    init(a,b,c); 
} 

private: 

void init(int a, int b, int c){ 
    this->a = a; 
    this->b = b; 
    this->c = c; 
} 
}; 

これは、この例ではキル上のように見えるかもしれませんが、それが唯一の理由は例の単純さです。現実の世界のアプリケーションでは、これは実際には繰り返しコードの削減の点で利点をもたらすでしょう。

+0

これはどの言語ですか? – Johnsyweb

+0

申し訳ありません、JavaとC++は時々一緒に私のためにぼやけます。あなたが有効なgetA()、getB()、getC()関数を持っていると仮定して、私は自分の投稿を編集しました。 –

+1

'this.a'は無効で、コピーコンストラクタはconst参照を引数として取るべきです。 –

1

OK C++ 11は、必要なものをカバーします。それはクランのDEVリストに数回を育てられています

/* This one is covered by providing default parameters see below. 
public Foo() { 
    this(0,0,0);//Not needed in this case, just to clarify 
} 

This is done automatically by the compiler. 
You do not need to write any code for this: 
public Foo(Foo f){ 
    this(f.getA(), f.getB(), f.getC()); 
} 
The compiler generated version actually looks like this: 
public Foo(Foo const& f) 
    : a(f.a) 
    , b(f.b) 
    , c(f.c) 
{} 



*/ 

// Now you can use all three methods and they work fine: 
public Foo(int a = 0, int b = 0, int c = 0) 
    : a(a) 
    , b(b) 
    , c(c) 
{} 

F f1;  // default construct no parameters: uses the three parameter version 
F f2(f1); // Copy constructed. Generated by the compiler. 
F f3(1,2,3); // Nomal constructor 
+0

私は一般的には、パラメータのデフォルト値を使用することに反対しています。もしそうでなければ、それはどのように使うことができますか?つまり、実際に 'Foo(int、int、int)'を使用する4つの方法意味をなさない –

関連する問題