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)。

这个问题的最短解决方案是什么?

一个丑陋且糟糕但简短的解决方案是:

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);
}

一个长期的解决方案是:

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

一个好的解决方案是复制所有数据:

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 回答