2016-09-25 7 views
2

サブオブジェクトを割り当てる適切な方法は何ですか?たとえば:サブオブジェクトの割り当て

struct A { 
    int x = 2; 
    int y = 3; 
}; 

struct B: A { 
    int z = 5; 
}; 

int main() { 
    std::unique_ptr<B> bp{new B{}}; 
    A a; 
    a.x = 12; 
    a.y = 13; 
    *(static_cast<A*>(bp.get())) = a; // happens to work, but is it the right way? 
    std::cout << bp->x << " " << bp->y << std::endl; 
    return 0; 
} 

これは動作します(または動作するようになりますか?)が、厄介であるとBのレイアウトについての仮定に依存しています。では、正しい方法は何ですか?

答えて

2

を:

bp->A::operator=(a); 

この種のことはかなりかかわらず稀なので、それは難しいです言う。一般的に、より良いキャストを避けることはできますが、キャストを明示的に行うと、珍しいことをしていることを明確にするのに役立ちます。

+0

なぜそれほど珍しいのですか?また、明示的キャストはこの場合に動作することが保証されていますか? – AlwaysLearning

+0

@AlwaysLearning:理由は言うまでもないが、私の経験では珍しい。一般に、継承を使用している場合、オブジェクト状態の抽象化を何らかの形で実行しようとしています。 –

+1

@AlwaysLearning:x、y、zのメンバーを使うと、デカルト座標をモデル化しようとしていると思います。継承を使用することによって、3D座標が正しいモデルではない2D座標であると効果的に言います。多分それは意図ではありませんでした。 –

3

通常、サブオブジェクトは割り当てません。それは概念的に間違っており、継承がどのように働くべきかに違反します。あなたがこれを必要とする場合は、おそらくあなたは間違った抽象化を持っているし、本当に構図たい:これはもう少し慣用的かもしれ

struct B { 
    A a; 
}; 

std::unique_ptr<B> bp{new B{}}; 
A a{12, 13}; 
bp->a = a; 
+0

"概念的に間違っていて、継承がどのように動作するはずですか"ということを詳しく教えてください。 – AlwaysLearning