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

C++ construct a series of interdependant classes with no default constructor?

本文关键字:依赖 构造函数 默认 一系列 C++      更新时间:2023-10-16

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

在析构函数中。

创建一个包含所有这些内容的类:

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

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

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