C++两个类相互调用

来源:互联网 发布:java tcp 多线程 编辑:程序博客网 时间:2024/06/16 03:04


----C++头文件相互引用,一个#include,另一个class C

C++头文件相互#include时最好是:(1)在"CA.h"中 #include "CB.h".(2)在"CB.h"中用类的前向声明: class CA;(3)最好加上头文件卫士( #ifndef ***   #define ***  #endif)示例如下:(1)"CA.h":#ifndef HEADER_CA#define HEADER_CA #include "CB.h" class CA{         CB* pB;         CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间}; #endif(2)"CB.h":#ifndef HEADER_CB#define HEADER_CB class CA;//这个必须要用,不能只用#include "CA.h",如果只是#include "CA.h"而没有class CA;则会报错.class CB{         CA* pA;         //CA a;//错误,因为此时还不知道CA的大小,无法分配空间}; #endif ---------------(3)"CA.cpp":#include "CA.h" 但是,.cpp文件只能#include “CA.h”.如果#icnlude “CB.h”则错误(展开后CA不识别CB),原因可自己分析.CB.h重复包含定义了两个头文件//a.h#include"b.h"class a{  …  b *b1;};//=========================//b.h#include "a.h"class b{   …   a *a1;};这样子是编译不了;解决方式如下:解决方法一:(试过好用)不需要这么包含,除非必要,如果你只是想在另外一个类中定义一个类的成员变量,只要在头文件中加入 class 类名;然后要在.cpp文件中再包含这个头文件就可以了。(这是必须的,不然找不到),因为这种方式只是在头文件中包含了该类,在源文件中还不包含,这样做只是为了避免相互包含报错。//a.hclass b;  //由原来的#include "b.h"变为class b;(或者相反)class a{  …  b *b1;};//=========================//b.h#include "a.h"class b{   …   a *a1;}; 第二种解决方案:加入宏定义#ifndef __A_H__#define __A_H__class b;class a {...}#endifb.h#ifndef __B_H__#define __B_H__class a;class b {...}#endif


两个类分别引用对方类指针

#ifndef CLASSB_H#define CLASSB_H#include"classa.h"//对方头文件#include<iostream>using namespace std;class ClassA;class ClassB{public:    ClassB();    ~ClassB();    ClassA *pa;    //ClassA a;    void b_show(){        cout<<"b show"<<endl;    }};#endif // CLASSB_H


#ifndef CLASSB_H#define CLASSB_H#include"classa.h"//对方头文件#include<iostream>using namespace std;class ClassA;//对方类声明class ClassB{public:    ClassB();    ~ClassB();    ClassA *pa;//对方类指针    //ClassA a;    void b_show(){        cout<<"b show"<<endl;    }};#endif // CLASSB_H



原创粉丝点击