2011-02-06 27 views
2

C++で何かする方法が不思議でした。私はこの構造体のインスタンスを作成できるようにしたいです派生構造体と親構造体へのC++キャスト

struct ComplexInstruction : simple_instr 
{ 
    bool isHead; 
    bool isTail; 
}; 

simple_instrインスタンスからすべてのデータをコピーします。だから、基本的に、私はこの

ComplexInstruction cInstr = instr; // <- instance of simple_instr 

のような何かをしたいと(それらの多くがありますので)すべてのフィールドをコピーすることなく、INSTR内のすべてのデータのコピーを持ってcInstrを持っています。どのようにこれを行うかわからない、と私は単純なキャスティングが動作するとは思わない。さらに、その逆を行うことは可能ですか?私。 ComplexInstructionのインスタンスを持って、それをsimple_instrのインスタンスに変換します。私は、これは鋳物を使用して行うことができますが、私はドンと仮定し、tは、事前に

おかげで、C++の経験がたくさんある

答えて

7

派生クラスにコンストラクタを作成して、基底クラスから初期化します。

class Base 
{ 
    int x; 
public: 
    Base(int a) : x(a){} 
}; 

class Derived : public Base 
{ 
public: 
    Derived(const Base & B) : Base(B){} 
}; 

あなたがベースの派生オブジェクトを持っている場合、あなたが実際にベースオブジェクトを持っていて、安全にそのようにベースコピーのctorを使用できることに注意してください。あなたはより冗長になりたい場合は

Derived d; 
Base b(d);//the parts of Base that are in Derived are now copied from d to b. 
      //Rest is ignored. 

、あなたが

void operator=(const Base & b) 
{ 
    Base::operator=(b); 
    //don't forget to initialize the rest of the derived members after this, though. 
} 

のようなあなたの派生クラスで演算子を=書くそれはすべて、本当に、あなたが何をしたいのかに依存します。重要なことは明示的であることです。クラスの初期化されていないメンバーを残してはいけません。

+0

これは、ベースによって提供されるデフォルトのコピーctorが十分であることを前提としています。そうでなければ、別のものを定義する必要があります。 –

+1

+1これは最高の解決策です(実際には正しいものです)。基底のデフォルトのコピーコンストラクタが十分でない可能性のある問題は、それ自体の問題であり、この特定の質問とは無関係です。 (わずかな改善は、 'Base'コピーコンストラクタの本体での代入の代わりに初期化リストを使用することです) –

+0

解決策は問題ありませんが、しばしば1パラメータの非コピーコンストラクタを明示的にします。 – Philipp

0

編集:これは、これを実現するための最良の方法ではありませんは、他のを見てください。答え。


これは、あなたが探していることを行います。

struct ComplexInstruction : simple_instr 
{ 
    ComplexInstruction(const simple_instr &simple) 
    { 
     *((simple_instr*)this) = simple; 
    } 

    bool isHead; 
    bool isTail; 
}; 

ComplexInstruciton complex = simple;は変換コンストラクタを呼び出します。 ComplexInstructionのコピーコンストラクトはthisを基本クラスにキャストし、=はsimple_instr'sコピーコンストラクタを呼び出します。これはデフォルトではビット単位のコピーです。

+1

私はちょうどそれを偶然に試みたので、私にスタックオーバーフローの例外を与えたので面白いです:) – Marlon

+0

Doh!もちろん、コピーコンストラクタをシンプルに呼び出すことになります。 – shf301

+0

OK、コンストラクタの基本型へのキャストで編集し、VS2010 – shf301

3

あなたはconst simple_instr&に変換可能な引数を取るコンストラクタを提供する必要があります。

ここ
struct simple_instr { 
    int i; 
    simple_instr(): i(0) { } 
    explicit simple_instr(int i): i(i) { } 
}; 

struct ComplexInstruction: simple_instr { 
    explicit ComplexInstruction(const simple_instr& simple): 
    simple_instr(simple), isHead(false), isTail(false) { } 
    bool isHead; 
    bool isTail; 
}; 

int main() { 
    simple_instr instr; 
    ComplexInstruction cInstr(instr); 
} 

私は明示的なコンストラクタを選んだが、意味に応じて、暗黙の1はまた、適切であろう。コンストラクタが暗黙的である場合のみ、=スタイルの初期化はキャストせずに機能します。