前向声明的替代方案:两个相互使用的类

Alternative for forward declaration: two classes using each other

本文关键字:两个 声明 方案      更新时间:2023-10-16

我有一个类A,它必须实现一些函数。由于实现其中一个需要它自己的数据结构,我假设A包含另一个类B,它具有所有需要的数据结构和函数。然而,B也需要使用A的数据结构和函数。我使用了两个类,它们使用正向声明相互调用。但仍然存在问题。例如,我需要使A中的所有数据结构都是公共的,这样B才能访问它。我尝试使用友元类,但当我将B声明为具有实现B功能的子类的抽象类时,我需要将A中的全部数据结构都设为公共的。因为友元类不适用于继承的子类,所以A的所有数据结构都需要是公共的。这让我的设计很混乱。

class B; 
class A{
protected: 
    int ds[100];
    B * b; 
public:
    a_func(){ 
        b->b_func(); 
    }
};

class A; 
class B{
    A * a; 
public: 
    b_func(){
        a->a_func(); 
    }
};
class sub_B:public B{
public: 
    b_func(){
        a->a_func(); 
        a->ds ...; 
    }
}

我的问题是:有其他设计吗?

我还尝试将A作为一个抽象类,而类B实现了它的一个函数,然而,当我想要一个A的对象时,从概念上讲,构建一个B的对象是没有意义的。

您不必在类定义中提供成员函数定义:

class A;
class B;
class A {
  // no need for public
  B * b;
  void a_funct(void);
};
class B {
  // no need for public here, too
  A * a;
  void b_funct(void);
};
// the following goes in a source file,
// otherwise you should mark it as inline
void A::a_funct() {
  b->b_funct();
}
void B::b_funct() {
  a->a_funct();
}

请注意,上面的代码只是一个例子,在它的当前形状中,它只是一个奇特的无休止(递归(循环。