cpp类相互引用的问题,如何避免头文件相互包含

⌚Time: 2022-09-12 23:01:23

👨‍💻Author: Jack Ge

两个类A,B,相互引用,如果互相包含彼此的头文件,造成无限包含,编译出错

对于类A,B,在类A的头文件中包含B的头文件与创建B的成员变量,而在B的头文件中,前向声明一个类A,并且定义一个指向A的指针pA成员变量,这样类B的头文件中就不需要包含A的头文件,因为它不需要知道类A的定义。但是需要类B的cpp文件中去包含A的头文件并对pA进行实例化操作。如果在cpp中忘记包含A的头文件,就会出现类的不完整定义错误


error: invalid use of incomplete type 'class xxx'

如果A和B相互引用,但是只在B的成员函数中需要使用到类A,只需要在类B的cpp文件中包含类A的头文件就可以了。就可以避免头文件重复包含

例子:

CA.H


#ifndef _CA_H

#define _CA_H



#include "CB.h"

class CACA{

    public:

    CACA();

    int get_value();

    void show_value();

    private:

    CBCB cb_0;

    int m_value;

};

#endif

CA.CPP


#include "CA.h"

CACA::CACA(){

    m_value = 3;

}

int CACA::get_value(){

    return m_value;

}

void CACA::show_value(){

    cb_0.show();

}

CB.H


#ifndef _CB_H

#define _CB_H

#include <iostream>

using namespace std;

//类CACA的前向声明

class CACA;

class CBCB{

    public:

    void show();

    private:

    CACA *pCA;

};

#endif

CB.CPP


#include "CA.h"

#include "CB.h"

void CBCB::show(){

    pCA = new CACA();

    cout<<"thie value is ";

    cout<<pCA->get_value()*2<<endl;

}

MAIN.CPP


#include "CB.h"

#include "CA.h"



int main(){

    CACA    ca;

    ca.show_value();

    return 0;

}

运行


g++ CB.cpp CA.cpp main.cpp

a.exe

thie value is 6

总之头文件应该只包含本模块各种符号的声明而不是定义,并且使用#ifndef-#define-#endif块包括,避免重复包含

而在源文件中包含本模块和其它模块的头文件和本模块所有符号的实现