【发布时间】: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