• 两个类相互包含对方成员的问题


    (源自:http://a117702.blog.163.com/blog/static/327871062009716111134177/

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型
    class A
    {
        int i;
        B b;
    }

    class B
    {
        int i;
        A* a;
    }

    请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子:
    class A
    {
      int i;
      B  b;
    }

    class B
    {
      int i;
      A   a;
    }
    在这种情况下,想想可以有a.b.a.b.a.b.a.b.a.b…………,很有点子子孙孙无穷尽之状,那么我的机器也无法承受。最主要的还是这种关系很难存在,也很难管理。这种定义方式类同程序中的死循环。所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

    言归正传,那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的,如下:
    //class A.h
    #include "B.h"
    class A
    {
      int i;
      B   b;
    }

    //class B.h
    #include "A.h"
    class B
    {
      int i;
      A *a;
    }

    如上的包含方式可能会造成编译器有错误提示:A.h文件中使用了示知类型B。
    怎么办?
    一般的做法是:两个类的头文件之中,选一个包含另一个类的头文件,但另一个头文件中只能采用class *;的申明形式,而在实现文件中(*.cpp)中包含头文件,如下:
    //class A.h
    #include "B.h"
    class A
    {
      int i;
      B   b;
    }

    //class B.h
    class A;
    class B
    {
      int i;
      A *a;
    }

    //B.cpp
    //在B.cpp中的文件包含处要有下面语句,否则不能调用成员a的任何内容
    #include "A.h"
    B::B()
    {
    ……
    }

  • 相关阅读:
    获取服务结合随机算法
    服务发现
    使用第三方库来支持平滑重启
    简易配置中心Confd入手
    8、SQL基础整理(约束)
    7、SQL基础整理(子查询)
    6、SQL基础整理(日期时间数据类型,转换函数)
    5、SQL基础整理(字符串函数)
    4、SQL基础整理(规范函数)
    3、SQL基础整理(分组)
  • 原文地址:https://www.cnblogs.com/kevinGaoblog/p/2471844.html
Copyright © 2020-2023  润新知