网页功能: 加入收藏 设为首页 网站搜索  
C/C++ 应用漫谈一
发表日期:2006-08-30作者:[转贴] 出处:  

本系列的简单说明:阅读本系列的要求是对C++有一些基本的了解,本系列不是C++的教程。本系列也没有明确的主题,但都是围绕C/C++的基本特性以及在实际中的应用而展开的,而且主要偏向C++,但有些内容可能也适合于纯C。

C/C++是当今最为广泛使用的程序设计语言之一,在商业软件开发中广为应用,当然在Game开发中也不例外。C和C++之间的关系不用我多说了,他们之间常常并称为C/C++,但我却常能看到有人争论是使用纯C呢还是使用C++,两派各不相让,双方都自认为很有道理,一般来说我不愿参与无聊的争论,不过就我看到的情况来说,持C++是垃圾观点的人大多非常不了解C++且有很强自信心的人(我不想挑起战火:),我想说的是程序结构的好坏与具体语言关系不是太大,我见过有人能用C写出良好的比较清晰的代码,但更多的人能用C++写出极差的非OOP难懂难维护的代码,但我得说C++相比C来说是更容易写出具有良好结构清晰易维护的代码。总得来说,持C++不好的人正在减少之中,这可能与编译器的发展也有一定的关系,相比C来说,C++的编译器要复杂难写得多,所以在几年前,PC上的一些C编译器不支持C++或支持得不好,PC以外平台的情况可能更是如此,近几年来,C++编译器如Windows平台上的Visual C++及其它*NIX平台上的GNU C++等C++支持得相当出色,加之C++的原理、思想方法的普及,优秀类库例程书籍的大量涌现,使C++得到了更为广泛的应用。好了有些跑题了,这个话题就此打住,下面我们来看看C/C++在开发(并不特指Game开发)中的具体应用。

我们知道C++中引入了类的概念,在C++的类中可以有构造函数(Constructor)和析构函数(Destructor),其中析构函数在类实例的内存释放时会自动调用,这一点可以给我们带来很大的方便性,常规的好处我就不说了,教科书解释得比我清楚多了,下面我们来看看如何灵活应用这点。我们有时候可能需要在运行某段代码前先做某事,运行完以后要恢复成原来的状态的配对操作,比如说{Lock, Unlock},{进入临界区,离开临界区},{显示一个等待光标,恢复为原来的光标}等等,而如果忘记了配对操作的另一半将会引起许多问题,轻则显示不正常,重则引起系统资源耗尽及/或程序异常退出,尤其在这段代码有多个退出点甚至执行中间有exception产生时更容易产生这种问题,这时我们就可以采用以下的方法来做一种比较特殊的C++类,这种类在构造函数里记录保存目前的相关状态参数或申请相关的资源,在析构函数里恢复原来的状态或释放相关的资源,一般没有其它成员函数。这样的话我们只要在这段代码的外边加入一个作用域,在进入这个作用域后就申明一个此类的实例变量,这时构造函数执行...,做了你想做的事,我们知道在C++中变量一旦离开作用域时所占用的内存被自动回收释放,在释放前会自动调用执行析构函数,这时...,做了你想做的事。听起来似乎很麻烦,其实很简单,而且此法经在实践中被广泛采用,有兴趣人可看Douglas C. Schmidt写的"Strategized Locking, Thread-safe Interface, and Scoped Locking"一文中的"scoped Locking idiom"这段,此法已经在他的ACE中被广泛应用。下面我们来看一个我在实践中具体应用此法的例子。假设有时我们可能需要某段代码(以后也许会有具体应用的介绍)在最高优先级运行,运行完后恢复到原来的程序优先级,甚至这段代码中间有exception产生,也应自动恢复原来的优先级,这也正符合以上说的配对情况,我们可以在构造函数里读取保存当前的程序优先级,并将当前线程设置到最高优先级,在析构函数中则自动此线程的优先级恢复到原来值。那么这个类设计好使用情况应该如下:

Constructor:
m_hCurrentProcess = ::GetCurrentProcess();
m_hCurrentThread = ::GetCurrentThread();

m_dwPriorityClass = ::GetPriorityClass(m_hCurrentProcess);
m_nThreadPriority = ::GetThreadPriority(m_hCurrentThread);

::SetPriorityClass(m_hCurrentProcess, dwPriorityClass);
::SetThreadPriority(m_hCurrentThread, nThreadPriority);

Destructor:
::SetPriorityClass(m_hCurrentProcess, m_dwPriorityClass);
::SetThreadPriority(m_hCurrentThread, m_nThreadPriority);

在实际中的应用可以这样写(假设这个类名为CF3DHighPriority):

... 在普通优先级运行的代码 ...
{	// 这对{}起添加一个作用域的作用
    CF3DHighPriority	highPriority;
.... 在高优先级运行的代码 ....
}
... 在普通优先级运行的代码 ...
是不是很简单呢,如果对此类具体实现代码有兴趣可看HighPriority.hHighPriority.cpp

总结:本篇介绍了一种C++类的写法,能够方便的处理一些配对情况,使代码更简明且不易出错。

以后我会不定期再继续这个系列。
我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 C/C++ 应用漫谈一
本类热点文章
  C++ 常用模板武道会
  深入运算符new 返回值
  实现一个脚本引擎
  C/C++ 应用漫谈一
  剖析C++模板(下)
  C++源代码游戏编程--WinMain()函数集
  怎样在游戏中实现脚本控制
  角色扮演游戏引擎的设计原理
  RPG脚本之道
  C++ STL简介
  STL 简介,标准模板库
  Generic: 再谈Min和Max
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00509