我有一个小C ++问题,我不知道最好的解决方案。我有两个A和B类如下:
class A {
int n;
B* b;
public:
A(int num): n(num) {
b = new B[n];
for (int i = 0; i < n; i++) {
b[i].setRef(this);
}
}
~A() {
delete [] b;
}
};
class B {
A* a;
public:
B() { }
B(A* aref) {
a = aref;
}
void setRef(A* aref) {
a = aref;
}
};
我正在通过向其构造函数传递我想要创建的B类对象的数量来创建A类的对象。我希望B类的每个对象都拥有一个指向创建它的类A对象的指针。我认为最好的方法是将指针传递给A类对象作为B类对象的构造函数参数。
但是,由于我正在使用new
运算符,因此调用了类B的no-args构造函数。因此,我在这里看到的唯一解决方案是在使用setRef(A*)
运算符构造B类的每个对象后调用new
方法。
是否有更好的解决方案/设计模式更适用于此?对B类使用展示位置new
会更好吗?
提前感谢您的帮助。
答案 0 :(得分:1)
1)使用向量而不是内存管理的内存。使用vector的以下构造函数来创建B对象。这是本机数组中的已知限制:
A(std::size_t num): b_vec(num, B(this)), n(num) { }
因为您不需要B的深拷贝构造函数,所以默认构造函数可以使用。请记住,没有办法使用某个值的重复副本构造数组。
2)使用placement new,但那只是解决了错误的问题恕我直言。除非您需要为数组的不同对象调用不同的构造函数。
答案 1 :(得分:1)
你有没有理由不能使用STL?如果STL没问题,请使用std::vector
。
e.g。
#include <vector>
class B { ... };
class A
{
std::vector< B > b;
A::A( int num )
: b( num, B( this ) )
{
}
...
};
这将创建一个B对象的向量,通过调用复制构造函数对每个对象进行初始化。这还有一个额外的好处,即无需调用delete[]
。