【问题标题】:Alternative for forward declaration: two classes using each other前向声明的替代方案:两个类相互使用
【发布时间】:2015-07-04 17:34:44
【问题描述】:

我有 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 的对象在概念上没有意义。

【问题讨论】:

  • 为什么需要替代品?只需将实现(函数定义)移动到单独的翻译单元(.cpp 文件)。
  • 单位不同。一切都是分开的。但是,将 A 的每个数据结构都公开,并不是一个好的设计。看起来 A 也不包含 B 并且 B 是 A 内部的一个较小的单元。
  • 改用纯抽象接口。他们不一定需要公开曝光。可能有帮助:How can I remove/refactor a «friend» dependency declaration properly?
  • 这听起来类似于 Java 内部类。 (这不一定是坏事。)

标签: c++ inheritance abstract-class forward-declaration


【解决方案1】:

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

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();
}

请注意,上面的代码仅作为示例,在其当前形式中,它只不过是一个花哨的无限(递归)循环。

【讨论】:

  • 如果我不输入“public”,它将是私有的。所以我无法访问 b_func 或 a_func。
  • 是的,所以您的问题不是前向声明,而是这些类之间的一般耦合。尽管如果您不提供更具体的信息,没有人能为您提供太多帮助。
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2011-04-12
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多