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