分类:
2008-10-13 16:30:24
编译环境VS 2005
首先我们先建立一个项目,项目文件有:
A.h
B.h
C.h
A.cpp
B.cpp
C.cpp
文件内容如下:
A.h
#ifndef EVENTHANDLER_CEVENTHANDLER_H_HEADER_INCLUDED_BA392BB6
#define EVENTHANDLER_CEVENTHANDLER_H_HEADER_INCLUDED_BA392BB6
#include "B.h"
class A
{
public:
B b; //其实不应该用一个对象,应该用指针,这里只是为了说明问题
};
#endif
B.h
#ifndef EVENTHANDLER_CEVENTHANDLER_H_HEADER_INCLUDED_BA392BB6B
#define EVENTHANDLER_CEVENTHANDLER_H_HEADER_INCLUDED_BA392BB6B
#include "C.h"
class B
{
public:
};
#endif
C.h
#ifndef EVENTHANDLER_CEVENTHANDLER_H_HEADER_INCLUDED_BA392BB6C
#define EVENTHANDLER_CEVENTHANDLER_H_HEADER_INCLUDED_BA392BB6C
#include "A.h"
class C
{
public:
};
#endif
A.cpp
#include "A.h"
B.cpp
#include "B.h"
C.cpp
#include "C.h"
我们先做一个试验,分别注释掉A.cpp,B.cpp,C.cpp中的包含文件,每次只留下一个,比如第一次(A情况)注释掉:B.cpp,C.cpp中的包含文件语句,第二次(B情况)注释掉A.cpp,C.cpp中的包含文件语句,第三次(C情况)注释掉:A.cpp,C.cpp中的包含文件语句,便以结果如下表:
测试用例 |
编译结果 |
A |
编译通过 |
B |
编译出错syntax error : missing ';' before identifier 'b' |
C |
编译通过 |
为什么在B情况下会出现b标识符没有找到呢?我们来分别分析一下这几种情况:
A情况中只有 “A.cpp”文件中包含”A.h”,那么编译器开始首先编译”A.cpp”文件,它首先看到#include “A.h”语句,这时它并不是立刻展开”A.h”,而是会到”A.h”里再找是否有包含别的.h文件,如果有编译器则再到那个.h文件里再找是否有包含其他的.h文件,直到最低层,所以情况变成了在A.h中又找到#include “B.h”,然后又在”C.h”里找到#include “A.h”但此时A.h已经包含过一次了,所以跳出。最终在A.cpp文件里的内容可能是这样:
class C
{
public:
};
class B
{
public:
};
class A
{
public:
B b;
};
B情况的分析过程与A类似,在B.cpp文件里的内容可能是这样:
class A
{
public:
B b;
};
class C
{
public:
};
class B
{
public:
};
C情况的分析过程一样,在C.cpp文件里的内容可能是这样:
class B
{
public:
};
class A
{
public:
B b;
};
class C
{
public:
};
经过上面的代码可以看出,显然B情况是错误的,而且确实B在出现以前并没有声明。
其实头文件包含过程很像一个栈的调用过程,编译器会去找文件中包含的那个头文件里是否包含其他的头文件,直到找到最底层头文件或没有包含头文件为止,然后再一层一层返回展开头文件里面的内容。
这篇文章的目的是为了说清楚头文件出现循环包含时,代码可能的呈现,因为只要你知道代码的呈现就很容易解决头文件循环包含的错误,就上上面变量没有找到的错误。文章仓促写成肯定会有错误,望大家多指正交流。
(原创文章,如需转载请注明出处)
这篇文章并不是介绍如何使用Rational Rose,我想说的只是我使用它的一些经验,那就是使你的类图变色,让你的设计更美观以及更易理解。
首先让我们来看一个类设计图:
这个图没有经过任何修饰,虽然很工整,但给人一眼看上去并不十分容易理解,那么我们在看下面这个图:
这个图就加了一些修饰,你们可以看到一些与上图的变化:
第一把所有的类分类了:分成控制类,实体类等等,这个在Rational Rose里本身就可以设置,但不同种类的类你可以给予不同的颜色,比如实体类(绿色),控制类(蓝色),边界类(粉红色)等等,同时你可以把类分的更细一些,比如分出给自己和给外界用的边界类以及其他的一些辅助类。这样使用者以看上去就知道不同种类的类,而且各个颜色的类有提醒和警示的作用。
第二把类分层,比如最简单的就是按照MVC模式来分,当然你更可以按照自己系统的特点来分层,不同的层用不同的颜色来表示,所以你可以看到上图中有深灰色一直到淡灰色的渐变。不同层的类功能也是不同的。这样做的目的是让用者一下就可以看出你系统模块的层次与结构,并且能把你的类很容易的划归到你层次中。
第三,不要忘记给颜色加注释。这样让用者看得更明白一些。
其实大家可以看出上面的操作很简单,比如颜色的改变只要”fill color”就可以了。层次使用Note来做的。
以上只是我的一些个人经验,当然可以根据不同的情况来做适当调整。希望对大家有用处。
(原创文章,如需转载请注明出处)