デフォルトのコンストラクターを持たない外部ライブラリのクラス A、B、C、D があります。
オブジェクト A が与えられます。オブジェクト D が必要です。
書けない
D makeD(A a) {
B b(1,2,3);
C c(a,b);
c.setParam1(4);
c.setParam2(5);
return D(a,b,c);
}
中間体 B と C が破棄されると、返された D オブジェクトが使用できなくなるためです (D は B と C を参照によって格納します)。
この問題の最短の解決策は何ですか?
醜くて悪いが短い解決策の1つはこれです:
D makeD(A a) {
B* b=new B(1,2,3);
C* c=new C(a,*b);
c->setParam1(4);
c->setParam2(5);
return D(a,*b,*c);
}
1つの長い解決策は次のとおりです。
shared_ptr_xxl<D,B,C> makeD(A a) {
B* b=new B(1,2,3);
C* c=new C(a,*b);
c->setParam1(4);
c->setParam2(5);
return shared_ptr_xxl<D,B,C>(new D(a,*b,*c),b,c);
}
どこ
shared_ptr_xxl<D,B,C>
のようなものです
shared_ptr<D>
追加で持っていることを除いて
delete b;
delete c;
デストラクタで。