我有一个c ++,在A和B类中,每个人都有另一个类的成员。我该如何解决这个问题?
class A {
B memberY;
}
class B {
A memberX;
}
答案 0 :(得分:6)
您使用指针和转发声明。
//A.h
class B; //forward declaration to class B
class A {
B* memeberY;
}
header for class B:
//B.h
class A; //forward declaration to class B
class B {
A* memeberX;
}
对于对象实例,只能使用指针,不能这样做,因为实例需要编译器知道类的完整定义。
请注意,如果将内存管理分配给类,则应释放析构函数中的内存。这意味着您还应该覆盖班级中的copy constructor
和operator =
。
您可以让其中一个类包含另一个类的对象,但您必须在标头中包含其他类的标头。另一个必须通过前瞻性声明来解决。
答案 1 :(得分:3)
根据您的意愿,这是不可能的。其中一个类必须是指向另一个类的指针。您不能拥有实际对象的递归关系 - 对象的大小将是无限的。
所以你可能需要这样的东西:
struct B;
struct A
{
B * myB;
};
struct B
{
A * myA;
};
现在,构建成为一个问题,因为它们都需要相互引用。这就是我无法为你提供构造函数的原因,因为我不知道你将如何构造这些对象。
你现在也有一个清理问题,因为大概这些对象中的一个拥有另一个 - 他们都不能互相拥有。这排除了unique_ptr
的使用。我会使用smart_ptr
,但是你仍然有一个内存链接,除非你有一些函数来打破循环引用。
但是,如果你更好地说明你为什么要这样做,也许可以给出一个更合适的答案。