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