前向声明的替代方案:两个相互使用的类
Alternative for forward declaration: two classes using each other
我有一个类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();
}
请注意,上面的代码只是一个例子,在它的当前形状中,它只是一个奇特的无休止(递归(循环。
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 为什么系统日志有两个不同的函数声明?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 类型测试对象的动态数组的这两个声明之间的区别?
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 声明一个模板函数,将模板类友元的两个对象(仅)带到这两个专用化
- 声明一个模板函数,该函数接收两个泛型迭代器作为参数
- C++地图,这两个声明如何不正确
- 错误:'x'声明中的两个或多个数据类型
- 如何在两个类之外的模板类内部的非模板类中声明的朋友函数定义
- 是否必须在内存中"next to each other"两个相邻声明的公共字段?
- 使用 C++11 auto 关键字声明两个(或多个)变量
- 我如何防止静态类成员变量需要两个定义/声明
- 在循环中声明两个变量以逆转字符串?在C 中
- 如何组合两个仅在声明的类型上不同的函数
- 复制构造函数在声明两个对象时
- 在标准(C++14)中,哪里说以下两个声明是等价的
- 这两个声明有什么区别?
- 在c++ 11中使用auto和两个声明会发生什么?