0

デフォルトのコンストラクターを持たない外部ライブラリのクラス 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; 

デストラクタで。

4

2 に答える 2

1

それらすべてを含むクラスを作成します。

class E {
    public:
        E(A const & a):
            b(1, 2, 3),
            c(make_c(a, b)),
            d(a, b, c)
            {
        }
    private:
        static C make_c(A const & a, B const & b) {
            C c(a, b);
            c.setParam1(4);
            c.setParam2(5);
            return c;
        }
        A a;
        B b;
        C c;
        D d;
};
于 2012-12-03T18:59:34.293 に答える
0

良い解決策の 1 つは、すべてのデータをコピーすることです。

void makeD(A a, D &d2) {
   B b(1,2,3);
   C c(a,b);
   c.setParam1(4);
   c.setParam2(5);
   D d(a,b,c);
   CopyFrom(d,d2);
}

しかし、明らかに外部ライブラリからのサポートが必要です... 外部ライブラリがオブジェクトのインターフェースを介してすべてのデータ構造を公開できる場合に役立ちます。

CopyFrom() は d のメンバー関数を呼び出し、データを d2 にコピーします。実際には、d と d2 の型が異なることがよくあります。

std::vector でこれを試してみましょう:

void makeD(std::vector<int> &vec2) {
   std::vector<int*> vec;
   int a=10,b=20,c=30;
   vec.push_back(&a);
   vec.push_back(&b);
   vec.push_back(&c);
   CopyFrom(vec, vec2);
}

次に、CopyFrom は次のようになります。

void CopyFrom(std::vector<int*> vec, std::vector<int> &vec2) {
   for(int i=0;i<vec.size();i++) vec2.push_back(*vec[i]);
}
于 2012-12-03T18:04:30.103 に答える