先来看看以下这个例子:
Keyboard.h的代码为
#include Computer.h
Class Keyboard
{
public:
void BtnW();
void BtnS();
void BtnA();
void BtnD();
void BtnSleep();
//else button funs
private:
Computer* computer;
}
Keyboard.cpp的代码为
#include Keyboard.h
void Keyboard::BtnSleep()
{
computer->Sleep();
}
//else funs
Computer.h的代码为
#include Keyboard.h
#include Mouse.h
#include ComputerHost.h
#include Displayer.h
Class Computer
{
public:
Keyboard m_keyboard;
Mouse m_mouse;
ComputerHost m_computerHost;
Displayer m_displayer;
void Game();
void DealWord();
void Sleep();
//else functions
}
结构十分简单,主要问题就是Computer里包含了Keyboard类的对象,而Keyboard类中又包含有一个Computer指针(因为Keyboard类中的BtnSleep方法要使用到Computer类中的某些功能),所以两个头文件直接相互包含,而相互包含是编译器所不允许的。
为了解决这个问题,我们引出了前向声明这个概念,让我们将Keyboard.h的代码修改如下:
//#include Computer.h
Class Computer;
Class Keyboard
{
public:
void BtnW();
void BtnS();
void BtnA();
void BtnD();
void BtnSleep();
//else button funs
private:
Computer* computer;
}
修改点1是删除了Keyboard.h中的Computer.h包含;
修改点2是增加了Computer类的前向声明(即将Computer类的声明提前到Keyboard类的定义之前);
编译器的同一个编译块中,名字相同的类会当作同一个类处理,所以我们可以将Computer类的声明和定义分开,而且编译器是允许多个声明存在的,但是注意定义只能有一个!这样就解决了头文件相互包含问题。