zoukankan      html  css  js  c++  java
  • c++两个类相互调用

    有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型

    class A {
        B b;
    };
    
    class B {
        A a;
    };

      编译器在声明A的时候,由于B的声明在A的下面所以出现编译错误

    那么,在定义时如果要相互调用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的:

    //a.h
    #include"b.h"
    class A {
    public:
        B xianghuInA;
    };
    
    //b.h
    #include"a.h"
    class B {
    public:
        A xianghuInB;
    };

    怎么办?一般的做法是

    1)class B采用前置声明的方式声明class A

    2)在class B中只能声明class A类型的指针,因为定义指针时不需要对那个类的定义可见

    3)在class A的头文件中包含class B 的头文件

    //a.h
    #pragma once
    #include"b.h"    //一定要有
    class A {
    public:
        B xianghuInA;
        int a = 1;
        void funA();
    };
    //b.h
    #pragma once
    #include<iostream>
    
    class A;
    class B {
    public:
        int b = 5;
        A* xianghuInB = NULL;    //一定要是指针
        void  funB();
        ~B();
    };
    //a.cpp
    #include"a.h"
    #include<iostream>
    using namespace std;
    
    void  A::funA()
    {
        cout << xianghuInA.b << endl;
    }
    //b.cpp
    #include"b.h"
    #include<iostream>
    #include <typeinfo>
    using namespace std;
    
    void  B::funB()
    {
        cout << typeid(xianghuInB).name() << endl;
    }
    
    
    B::~B() {
        delete xianghuInB;
    }
    //main.cpp
    #include<iostream>
    #include"a.h"
    #include"b.h"
    using namespace std;
    
    int main()
    {
        A qq;
        qq.funA();
        B hh;
        hh.funB();
        return 0;
    }

    运行结果:

    或者:

    //main.cpp
    class B;
    class A {
        B* b;
    };
    
    
    class B {
        A a;
    };
  • 相关阅读:
    minicom使用
    Oracle(+)号用法
    金蝶AAS对HTTP方法有限制
    Maven设置utf8编码格式
    ELK实时日志分析平台环境部署--完整记录(ElasticSearch+Logstash+Kibana )
    Redis中的持久化操作
    iOS 动画Animation
    iOS打造属于自己的用户行为统计系统
    WEB前端,混合排版,有的宽有的窄,滚动会出现空白处,怎么办。
    hadoop云盘client的设计与实现(一)
  • 原文地址:https://www.cnblogs.com/Joezzz/p/10450701.html
Copyright © 2011-2022 走看看