• 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;
    };
  • 相关阅读:
    运维工程师的四个阶段
    必须知道的Linux内核常识详解
    Centos7/RHEL7 开启kdump
    sort实现ip排序
    如何判断是否开启超线程
    Django---进阶12
    Django---进阶11
    前端---进阶8
    前端---进阶7
    前端---进阶6
  • 原文地址:https://www.cnblogs.com/Joezzz/p/10450701.html
Copyright © 2020-2023  润新知