zoukankan      html  css  js  c++  java
  • C++类间相互引用

     

    两个类相互包含引用的问题 

    不管是下文中提到的例子,还是任何情况,使得class A的头文件需要include class B的头文件,class B的也要引用A的头文件,这种状况下,貌似会出现有一个类未定义的问题从而无法通过编译。 
    解决办法是: 
    A或者B任选一个采用头文件(A.h)引用另一头文件(B.h)的方式不变,而另外一方的头文件(B)中则在定义该类之前写一句class A;然后在B的cpp文件中引用A的头文件。 
    ================================================================ 
    (下文为转载) 
    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类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() 

    …… 
  • 相关阅读:
    MongoDB集群架构 调整,增加延迟备份节点服务器,删除仲裁节点(9)
    MongoDB 副本集管理-不定期更新(8)
    DML和查询操作说明(7)
    MongoDB 副本集权限认证(6)
    python之路——作业:Select FTP(仅供参考)
    python之路——作业:类Farbic主机管理程序(仅供参考)
    python之路——作业:高级FTP(仅供参考)
    python之路——RabbitMQ
    python之路——协程(greenlet、gevent、简单爬虫)
    python之路——多进程(进程间通信、进程池)
  • 原文地址:https://www.cnblogs.com/bigben0123/p/3630251.html
Copyright © 2011-2022 走看看