C++中头文件互相包含经常会出现编译错误.
示例代码如下:
A.h
#ifndef A_H
#define A_H
#include "B.h"
#include<iostream>
using namespace std;
class A
{
public:
// B b;
A();
virtual ~A();
void display(B& b);
void setvalA(int i);
int getvalA();
protected:
private:
int vala;
};
#endif // A_H
A.cpp
#include "A.h"
A::A()
{
//ctor
}
A::~A()
{
//dtor
}
int A::getvalA()
{
return vala;
}
void A::display(B& b)
{
cout<<"A display valB"<<b.getvalB()<<endl;
}
void A::setvalA(int i)
{
vala=i;
}
B.h
#ifndef B_H
#define B_H
#include<iostream>
#include "A.h"
using namespace std;
class B
{
public:
// A a;
B();
virtual ~B();
void display(A& a);
void setvalB(int i);
int getvalB();
protected:
private:
int valb;
};
#endif // B_H
B.cpp
#include "B.h"
B::B()
{
//ctor
}
B::~B()
{
//dtor
}
int B::getvalB()
{
return valb;
}
void B::display(A& a)
{
cout<<"B display valA"<<a.getvalA()<<endl;
}
void B::setvalB(int i)
{
this->valb=i;
}
main函数
#include <iostream>
#include "A.h"
#include"B.h"
using namespace std;
int main()
{
A a;
B b;
a.setvalA(1);
b.setvalB(2);
a.display(b);
b.display(a);
return 0;
}
运行上面程序,编译器将报错:
B.h中 A未声明.
若在class B中加入 A a;则会报A不是一个类型名.
解决方法如下:
B.h中不包含A的头文件,而是声明类A. 在B.cpp中包含A的头文件.
B.h
#ifndef B_H
#define B_H
#include<iostream>
using namespace std;
class A;
class B
{
public:
// A a;
B();
virtual ~B();
void display(A& a);
void setvalB(int i);
int getvalB();
protected:
private:
int valb;
};
#endif // B_H
B.cpp
#include "B.h"
#include "A.h"
B::B()
{
//ctor
}
B::~B()
{
//dtor
}
int B::getvalB()
{
return valb;
}
void B::display(A& a)
{
cout<<"B display valA"<<a.getvalA()<<endl;
}
void B::setvalB(int i)
{
this->valb=i;
}
如此以来,就可以编译成功了.
要注意在B.h中因为只是声明了类A,所以是绝对不能定义A的对象的(eg A a;),因为当定义类的对象时,系统会为该对象分配相应的内存空间.声明的类,不确定它的内部成员,也就无法为对象分配空间.对象定义肯定不能成功.但是可以定义引用和指针. (参见 C++primer 12.1.4类声明与类定义).