今天在编写C++小程序的过程中遇到一个问题,假如说我们现在要实现一个邮件消息Message类和消息存放目录Folder类;

一个消息可以属于多个目录,而一个目录也可以包含多个消息。

实现的基本方法是Message类中有一个指向Folder类的指针集合,message对象属于集合中的每个folder,而Folder类中又有一个指向Message类的指针集合,该集合包含了这个目录下的所有message。这么说好像有点晕。。。

代码如下:

1
2
3
4
5
6
7
8
//Message.h
#include "Folder.h"
class Message {
public:
...
private:
set<Folder*> folders;
}
1
2
3
4
5
6
7
8
//Folder.h
#include "Message.h"
class Folder {
public:
...
private:
set<Message*> messages;
}

上面代码中的Message类声明和Folder类声明相互引用,如果我们在两个类中分别#include另一个类,那么就会带来一个问题,编译器会发现头文件引用没有尽头,也就是说陷入了无限循环从而导致编译错误!

在网上查找相关资料后发现了一个比较好的解决方法,就是在Message或Folder类中声明另一个类,然后在类的定义中#include相应的类声明头文件。

可能有些不太好理解,代码实现如下:

1
2
3
4
5
6
7
8
9
10
//Message.h
class Folder;
class Message {
public:
...
private:
set<Folder*> folders;
}
1
2
3
4
5
//Message.cpp
#include "Folder.h"
//注意在定义文件中一定要引入相应的声明文件,否则会导致编译器报错无法引用一个不完整类型
...
1
2
3
4
5
6
7
8
//Folder.h
#include "Message.h"
class Folder {
public:
...
private:
set<Message*> messages;
}

这样问题就完美解决了!