C++构造一系列没有默认构造函数的相互依赖类
C++ construct a series of interdependant classes with no default constructor?
我有一个来自没有默认构造函数的外部库的类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]);
}
相关文章:
- C++是否可以创建依赖于单个构造函数参数的派生类而不是bass类
- 复制构造函数和分配操作员对循环依赖类别的过载
- C++构造一系列没有默认构造函数的相互依赖类
- C++ 在超类构造函数中运行依赖于子类覆盖的大量变量的代码的正确方法是什么?
- 构造函数初始化列表中的循环依赖项
- 通过包装器对象的构造函数将依赖关系传递给包装器对象
- 依赖注入/继承设计模式的构造函数参数太多
- 复制具有相互引用/循环依赖关系的类的构造函数
- C++:使用RAII解析构造函数-初始化器列表依赖项
- 依赖于尚未构造的对象的构造函数
- 在依赖类的构造函数中使用抽象类作为数据类型
- 为什么构造函数调用依赖于默认析构函数的存在?
- GCC 为依赖于默认构造函数的模板化类中的静态数据成员提供"undefined reference"错误
- 依赖隐式声明的move构造函数安全吗
- 如何在具有依赖元素类型的模板类构造函数中初始化向量
- C++:成员类之间的构造函数依赖关系
- 依赖于构造函数参数的类方法的特殊实现
- 在c++中,当组合对象构造函数有依赖关系时,如何在初始化列表中强制它们的顺序
- 构造函数依赖注入:unique_ptr + move vs shared_ptr
- c++循环依赖:构造函数应该是什么样子?