互引头文件的一种解决策略

在C++中经常会涉及到处于不同头文件的类互相引用的情况,有时候头文件引用(include)会搞得很乱,导致报一堆的错。其实遵循一定规则,可以避免大部分的混乱。

首先,要对头文件进行处理,保证不会出现重定义的错误。这个应该每个人都会,通常有两种做法:

1. 在.cpp文件中添加保护,比如在.cpp文件中添加:

#ifndef _XX_H_
#define _XX_H_
#include "xx.h"
#endif

2. 在.h中添加保护,比如在xx.h文件中添加:

#ifndef _XX_H_
#define _XX_H_
// 头文件声明内容
#endif

_XX_H_是我比较习惯的命名方式,其他的命名方式,比如__XX__H__,XX_H等等,只要足够Unique就好。建议使用第二种方式进行重定义的保护,一劳永逸而且具有通用性,任何人拿来就能用,不需要考虑保护问题。当然,如果在VS(03以上吧?)下,最好的解决方案是用#pragma once,更为简单有效。

其次,最好将所有头文件需要用到的自定义类(或函数)都在定义前声明一下,比如在xx.h的类xx中需要用到yy.h中的yy类,那么最好做以下的处理:

class yy;

class xx
{
// 实现内容
};

这样就可以保证头文件引用的次序不会对结果造成影响。

通常,保证以上两点,通常涉及到类互指的问题都可以解决。当然如果天生就有设计问题,无论如何都是没有办法的,比如:

// xx.h
class xx
{
yy t;
};

// yy.h
class yy
{
xx t;
};

不难看出,这是个递归定义,编译器无法确定类xx和yy的大小,就无法通过编译。一种解决策略是采用指针,比如:

// xx.h
class xx
{
yy* t;
};

// yy.h
class yy
{
xx* t;
};

当然,具体情况具体分析,提取一个更高层的类等手段都可以考虑。

posted @ 2011-12-15 22:46  dzqabc  阅读(425)  评论(0编辑  收藏  举报