对象A是B的成员,对象B是A的成员

时间:2011-12-21 07:12:14

标签: c++ oop

我有一个c ++,在A和B类中,每个人都有另一个类的成员。我该如何解决这个问题?

class A {
     B memberY;
}


class B {
     A memberX;
}

2 个答案:

答案 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 constructoroperator =

您可以让其中一个类包含另一个类的对象,但您必须在标头中包含其他类的标头。另一个必须通过前瞻性声明来解决。

答案 1 :(得分:3)

根据您的意愿,这是不可能的。其中一个类必须是指向另一个类的指针。您不能拥有实际对象的递归关系 - 对象的大小将是无限的。

所以你可能需要这样的东西:

struct B;
struct A
{
  B * myB;
};
struct B
{
  A * myA;
};

现在,构建成为一个问题,因为它们都需要相互引用。这就是我无法为你提供构造函数的原因,因为我不知道你将如何构造这些对象。

你现在也有一个清理问题,因为大概这些对象中的一个拥有另一个 - 他们都不能互相拥有。这排除了unique_ptr的使用。我会使用smart_ptr,但是你仍然有一个内存链接,除非你有一些函数来打破循环引用。

但是,如果你更好地说明你为什么要这样做,也许可以给出一个更合适的答案。