Chinaunix首页 | 论坛 | 博客
  • 博客访问: 367937
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

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.cppC.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在出现以前并没有声明。

其实头文件包含过程很像一个栈的调用过程,编译器会去找文件中包含的那个头文件里是否包含其他的头文件,直到找到最底层头文件或没有包含头文件为止,然后再一层一层返回展开头文件里面的内容。

 

这篇文章的目的是为了说清楚头文件出现循环包含时,代码可能的呈现,因为只要你知道代码的呈现就很容易解决头文件循环包含的错误,就上上面变量没有找到的错误。文章仓促写成肯定会有错误,望大家多指正交流。

 

 

(原创文章,如需转载请注明出处)


--------------------next---------------------

这篇文章并不是介绍如何使用Rational Rose,我想说的只是我使用它的一些经验,那就是使你的类图变色,让你的设计更美观以及更易理解。

 

首先让我们来看一个类设计图:


这个图没有经过任何修饰,虽然很工整,但给人一眼看上去并不十分容易理解,那么我们在看下面这个图:

 

 

这个图就加了一些修饰,你们可以看到一些与上图的变化:

第一把所有的类分类了:分成控制类,实体类等等,这个在Rational Rose里本身就可以设置,但不同种类的类你可以给予不同的颜色,比如实体类(绿色),控制类(蓝色),边界类(粉红色)等等,同时你可以把类分的更细一些,比如分出给自己和给外界用的边界类以及其他的一些辅助类。这样使用者以看上去就知道不同种类的类,而且各个颜色的类有提醒和警示的作用。

 

第二把类分层,比如最简单的就是按照MVC模式来分,当然你更可以按照自己系统的特点来分层,不同的层用不同的颜色来表示,所以你可以看到上图中有深灰色一直到淡灰色的渐变。不同层的类功能也是不同的。这样做的目的是让用者一下就可以看出你系统模块的层次与结构,并且能把你的类很容易的划归到你层次中。

 

第三,不要忘记给颜色加注释。这样让用者看得更明白一些。

 

其实大家可以看出上面的操作很简单,比如颜色的改变只要”fill color”就可以了。层次使用Note来做的。

 

以上只是我的一些个人经验,当然可以根据不同的情况来做适当调整。希望对大家有用处。

 

(原创文章,如需转载请注明出处)

 


--------------------next---------------------

阅读(207) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~