A -> B, B -> A 类关联
A -> B, B -> A classes association
这段代码不做任何特别的事情。它只是一个片段,用于显示前向声明的问题。只是一个简短的问题:为什么它不起作用以及如何强制它工作?
class A;
class B {
A obj;
public:
int getB() const {
return 0;
}
void doSmth() {
int a = obj.getA();
}
};
class A {
B obj;
public:
int getA() const {
return 1;
}
void doSomething() {
int b = obj.getB();
}
};
这段代码给了我错误:
error C2079: 'B::obj' uses undefined class 'A'
error C2228: left of '.getA' must have class/struct/union
前向声明只允许您使用指针和对对象的引用。您正在尝试在类定义可用之前完全定义一个。
要做到这一点,你应该将 A 中的 obj 更改为指针(可能不是最好的解决方案)或使用 PIMPL 习语(谷歌它),这应该可以让您解决此问题。
你的构造根本没有意义。A
和 B
都不是定义明确的结构,因为它们包含无限递归的子对象序列。
您刚刚提出了一个与此相同的问题的稍微模糊的示例:
struct Box { Box hubert; };
同样,这种数据结构毫无意义。
如果你愿意的话,编程中的所有内容都必须是有限的和有根据的。
实际上,C++通过要求类定义必须仅包含具有完整类型的成员对象来禁止您尝试执行的操作。但它只是归结为逻辑意义。想想如何初始化这样的数据结构。有些事情总是要放在第一位的。
这种类型的
循环依赖在C++是不可能的。不能让对象相互包含。但是,您可以存储指针或引用。如果没有完整的定义,您也不能真正使用类的方法。
因此,您需要做两件事:
1) 将对象替换为指针。
2) 在类定义之后实现方法。如果它们位于标头中,则需要将它们标记为inline
以防止多个定义。
class A;
class B {
std::shared_ptr<A> obj;
public:
int getB() const;
void doSmth();
};
class A {
std::shared_ptr<B> obj;
public:
int getA() const;
void doSomething();
};
inline int B::getB() const {
return 0;
}
inline void B::doSmth() {
int a = obj->getA();
}
inline int A::getA() const {
return 1;
}
inline void A::doSomething() {
int b = obj->getB();
}
我认为您需要为 obj A 和 obj B 创建头文件来解决您的问题。当定义 B 时,它只知道 A 存在,不知道 A 有什么函数/方法。
每个头文件都需要包含每个函数/方法的原型。例:
class A{
int GetA() const;
void DoSomething();
}
格式可能已关闭(我习惯了 Obj C 标头),但这应该会有所帮助。
相关文章:
- 关联容器的下界复杂性:成员函数与非成员函数
- EASTL矢量<向量<int>>连续的
- std::future_error:无关联状态
- 查找自动生成键并具有线性内存消耗的小型关联数组
- 如何在 OpenCV 中将图像与另一个图像相关联
- 删除提升存档对象也会删除与其关联的流?
- 变量如何以及在何处可能没有C++关联的名称?
- 将正态随机变量与任意 RHO(corrcoef) 相关联
- 试图(稍微)概括C++模板.关联容器键:值反转
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 与 std::unique_ptr 和抽象类关联的编译错误
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- 如何在 c++ 中创建分组多重映射键和关联值的表
- 为什么标准关联有序容器允许"const char*"作为其键?
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 枚举的复合赋值运算符真的应该根据其关联的算术运算符来定义吗?
- 如何使用 Ryzen 7 修复 Windows 上 Qt 5.9 线程的处理器关联