• 如何让两个文件的两个类相互关联


    做项目过程中,一般会遇到两个类相互关联的情况,而这两个类又分别放在两个不同文件中,所以就“情不自禁”地相互包含对方的头文件,然后就“理所应当”地编译错误了。在这里,就讲一下如何让位于不同文件的的两个类相互关联。

    首先设计类A(包括头文件classA.h和源文件classA.cpp),其中头文件classA.h要#include "classB.h",而源文件classA.cpp又#include"classA.h。这样,在头文件classA.h和源文件classA.cpp都可以使用类B的东西了。

    头文件classA.h源码如下:

    #ifndef _CLASSA_H_
    #define _CLASSA_H_
     
    #include "classB.h"
     
    class A{
          public:
                 void display();
                 void callB(B *b);
    };
     
    #endif

    源文件classA.cpp源码如下:

    #include <iostream>
    #include "classA.h"
     
    using namespace std;
     
    void A::display(){
         cout<<"this is class A"<<endl;
    }
     
    void A::callB(B *b){
         b->display();  
    }

    其次设计类B(包括头文件classB.h和源文件classB.cpp),这里,头文件classB.h是不能#include "classA.h",因为这样会和头文件classA.h形成相互包含,从而编译错误。那怎么样才能让头文件classB.h和源文件classB.cpp也都可以使用类A的东西呢?可以这样:头文件classB.h中声明类A,源文件classB.cpp中#include "classA.h"。头文件classB.h中声明类A,就是要告诉本模块类A是一个在其他地方声明定义的东西,在这里可以使用这个东西的名字,但由于还不知这个东西的具体定义,所以不能再这里实例化这个东西。

    头文件classB.h源码如下:

    #ifndef _CLASSB_H_
    #define _CLASSB_H_
     
    class A;
    class B{
          public:
                 void display();
                 void callA(A *a);
    };
     
    #endif

    源文件classB.cpp源码如下:

    #include <iostream>
    #include "classB.h"
    #include "classA.h"
     
    using namespace std;
     
    void B::display(){
         cout<<"this is class B"<<endl;
    }
     
    void B::callA(A *a){
         a->display();    
    }

    到这里,我们可以设计一个场景(main文件),源码如下:

    #ifndef _MAIN_CPP_
    #define _MAIN_CPP_
     
    #include <iostream>
    #include "classA.h"
    #include "classB.h"
     
    using namespace std;
     
    int main(){
        int pause;
       
        A *ap = new A();
        B *bp = new B();
       
        ap->callB(bp);
        bp->callA(ap);
       
        cin>>pause;
        return 0;
    }
     
    #endif

    运行结果如下:

     

    可以看出:

    类A调用了callB(B *b),而callB又调用了类B的display()

    类B调用了callA(A *a),而callA又调用了类A的display()

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/james1207/p/3263194.html
Copyright © 2020-2023  润新知