C ++构造了一系列相互依赖的类,没有默认的构造函数?

时间:2012-12-03 16:51:38

标签: c++

我有一个没有默认构造函数的外部库中的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; 
在析构函数中

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分: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);
}

但它显然需要外部库的支持......如果外国lib可以通过对象的接口发布它的所有数据结构,这会有所帮助。

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