我有一个类,该类的成员属性由在其他地方定义的对象组成。在下面的代码中,A
包含一个公共属性var
,它是一个B
:
class B {
public:
int x, y;
std::vector<int> z;
B(int a, int b, std::vector<int> c) {
x = a; y = b; z = c;
}
};
class A {
public:
B var;
A(int i, int j) {
std::vector<int> someVector;
B(i, j, someVector);
}
};
int main() {
A foo(5, 3);
return 0;
}
[(显然)不会编译,因为在实例化var
时实例化了A
,为时已晚,无法构建它。
我可以做类似的事情的最好方法是修改一些代码:
class B {
public:
int x, y;
std::vector<int> z;
B() {}
void setAttributes(int a, int b, std::vector<int> c) {
x = a; y = b; z = c;
}
};
class A {
public:
B var;
A(int i, int j) {
std::vector<int> someVector;
B.setAttributes(i, j, someVector);
}
};
这确实可以编译,因为属性是在实例化之后设置的。
但是有一种方法可以使您更接近第一个代码段?
A(int i, int j) : var(i, j, {}) {}
而且,在您的代码中B(i, j, someVector);
不会not初始化成员变量var
,而B.setAttributes(i, j, someVector);
根本不会编译。
如果无法定义有用的默认构造函数,并且不想进行丑陋的两步初始化,那么我想就没有办法绕着指向B的指针了。
#include <memory> class B { public: int x, y; std::vector<int> z; B(int a, int b, std::vector<int> c) { x = a; y = b; z = c; } }; class A { public: std::unique_ptr<B> var; A() { std::vector<int> someVector; var = std::make_unique<B>(5, 2, someVector); } }; int main() { A foo(); return 0; }
应该做到这一点。