我正在尝试用C ++创建一个循环组合,但我正在处理声明问题。我怎么能解决它们?
这是一个例子,A类包含B对象的向量,但是B类需要首先声明A,因为它在构造函数中需要:
class A {
private:
std::vector<B> sons;
public:
void create_son() {
B obj(this);
sons.push_back(obj);
obj.some_method();
}
};
class B {
private:
A* parent;
public:
B (A* _parent) { parent = _parent; }
void some_method() {}
};
答案 0 :(得分:4)
在class A
中,您使用class B
的对象,因此需要class B
的完整定义。要解决此问题,请将class B
定义置于class A
之上。同时,在class B
中,您只使用指向A的指针,因此您不需要class A
的完整定义:声明就足够了。
因此,在class A
定义之上添加class B
的前向声明。
class A;
class B {
private:
A* parent;
public:
B (A* _parent) { parent = _parent; }
void some_method() {}
};
class A {
private:
std::vector<B> sons;
public:
void create_son() {
B obj(this);
sons.push_back(obj);
obj.some_method();
}
};
答案 1 :(得分:1)
您可以转发声明指针类型:
class A; // sufficient to fully determine B
class B {
private:
A* parent;
public:
B (A* _parent) { parent = _parent; }
void some_method() {}
};
// now we have B defined, we can define A
class A {
private:
std::vector<B> sons;
public:
void create_son() {
B obj(this);
sons.push_back(obj);
obj.some_method();
}
};