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