zoukankan      html  css  js  c++  java
  • 如何让两个文件的两个类相互关联

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

    首先设计类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()

  • 相关阅读:
    [git]git的简单配置使用 (将你的代码上传到Github)
    学习进度报告【第六周】
    [错误解决]SpringMVC接收对象 中文乱码问题解决
    [架构]myeclipse配置SpringMVC 以及简单应用 教程
    [机器学习]AttributeError: module 'tensorflow' has no attribute 'ConfigProto' 报错解决方法
    [机器学习]RuntimeError: The Session graph is empty. Add operations to the graph before calling run(). 报错解决方法
    [python]机器学习 k-mean 聚类分析
    学习进度报告【第五周】
    学习进度报告【第四周】
    unity3d优化总结篇
  • 原文地址:https://www.cnblogs.com/james1207/p/3263194.html
Copyright © 2011-2022 走看看