我在一个项目上工作,我有很多类,这些类具有其他类的实例作为字段。问题是我必须以特定的顺序声明类,以便编译代码。下面的示例:
class A{
public:
B* b; //unknown type name B
A(){
b = new B();
}
};
class B{
public:
B(){
}
};
上面的代码不起作用,因为它说B是未知的。 但是,如果我在A之前声明B类 一切正常。
class B{
public:
B(){
}
};
class A{
public:
B* b; //Works perfectly
A(){
b = new B();
}
};
在我的项目中,无法重新安排类以使错误消失。 有办法绕过此错误吗?
答案 0 :(得分:0)
在我的项目中,无法重新安排类以使错误消失。有办法绕过此错误吗?
您正在描述循环依赖。 X
取决于Y
,而Y
取决于X
。这种依赖性是无法解决的。如果您可以从另一个类中删除对一个类的依赖,则可以重新定义这些定义,以便满足所有依赖。有时可以通过引入间接性来消除依赖性。
请注意,仅因为一个类定义(A
)依赖于另一个类(B
)的声明,但这并不一定意味着它依赖于该类的定义。您可以让一个类依赖于另一类的定义,而仍然使被依赖者类依赖于依赖者的声明。
此外,仅因为成员函数(A::A
)的定义取决于另一个类(B
)的定义,但这并不一定意味着该类(A
)具有同样的依赖性。这是因为没有必要在类定义中定义成员函数。
例如,您的示例类A
不依赖于B
的定义。因此,A
可以在B
之前定义:
// declaration of B
// not a definition
class B;
// definition of A
class A{
public:
B* b; // depends on declaration of B
// does not depend on the definition
A();
};
// definition of B
class B{
public:
B(){
}
};
// definition of A::A
// does depend on definition of B
A::A() {
b = new B();
}