头文件相互包含问题

先来看看以下这个例子:
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类的声明和定义分开,而且编译器是允许多个声明存在的,但是注意定义只能有一个!这样就解决了头文件相互包含问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值