• C++类相互包含


    1. 两个类需要相互包含的情景

    在观察者模式中,气象站的数据送给某些布告牌。

    气象站要知道通知哪些布告牌,所以气象站类至少有一个布告牌类型的链表。

    布告牌需要把自己注册到气象站类,告诉气象站类自己已经订阅消息,

    注册函数需要气象站类作为形参,才知道自己注册到哪一个气象站。

    也就是说,在类定义的时候,他们就是需要对方的!

    所以,我需要在各自类定义的头文件中,include对方类所在的头文件?错误!

    具体错误类型是:语法错误(标识符)。

    2.类(和结构体)是不能相互包含的

    类在定义的时候需要知道类的大小,实例化的时候才可以正确分配空间。

    假如类A正常定义,类B中有类A,这也是OK的,因为类A大小已知,类B大小也就已知了。

    假如A中有B,B中有A呢?A和B都不确定大小,好像进入了一个类似死锁的情景。

    A和B都不知道自己实例化对象的时候到底申请多少空间。

    同样结构体也是一样,是不可以相互包含的!

    3. 如何解决需要相互包含的情景?

    ①尽量使用指针来解决问题

    既然是因为大小不确定,导致的类定义错误,那就使用类的指针来替代类好了,使用起来没有什么区别!

    在Linux内核中,结构体特别多,肯定会出现相互包含的情况吧,所以Linux内核中尽量采用结构体指针。

    以后我们也尽量使用结构体指针,通过pStruct->fun()来调用方法。

    ②声明类,而不是包含头文件!

    类是在头文件中定义的,类在定义的时候需要包含其他类,所以需要在头文件中包含其他头文件。

    思考一下头文件相互include,会出现什么情况?

    include就是拷贝的意思,互相include,不就是无限制的拷贝下去吗?

    所以头文件的相互包含中也不支持。

    有什么解决方法呢?声明类取代include定义:class A;

    原来不知道,类也是可以声明的!

    ③如何调用声明类的成员函数?

    在定义类B的头文件中,声明了类A,那么类B中如何调用A.fun()?

    编译器又不知道A中有哪些成员函数,声明只是告诉有这个类,不提供其他信息。

    所以,不要在类的定义头文件中,使用其他类的方法。

    在哪里可以使用其他类的方法?在本类的成员函数的实现的cpp文件中可以!

    4.总结的几条重要结论!!!

    ①在类B的定义头文件中(B.h)不要include其他头文件(A.h)!

    ②在某个类的定义头文件中(B.h)需要其他类(A.h),使用类的声明(class A;)!

    ③尽量使用类/结构体指针替代对象!

    ④在某个类的定义头文件中(B.h),不应该调用其他类的方法(A.fun())!

    ⑤因为要在类B的成员函数的实现c文件中(B.cpp),才会开始调用A的成员函数(A.fun()),

    这个时候在B.cpp中包含include “A.h”就不会出问题了!

    参考:

    c语言结构体相互引用

    C++中两个类相互包含引用问题

  • 相关阅读:
    Jmeter入门(二、元件和组件)
    Jmeter入门(一)
    loadrunner (三、脚本执行&结果分析)
    loadrunner(二、创建脚本)
    Centos常用命令(九、shell编程-综合案例)
    Centos常用命令(八、shell编程-函数)
    利用python实现动态数组
    为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里
    #{}和${}的区别是什么
    Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不
  • 原文地址:https://www.cnblogs.com/Younger-Zhang/p/10629537.html
Copyright © 2020-2023  润新知