??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品无码久久98,久久综合九色综合网站,国产69精品久久久久久人妻精品http://www.shnenglu.com/cloud/category/3696.htmlzh-cnFri, 05 Dec 2008 12:34:14 GMTFri, 05 Dec 2008 12:34:14 GMT60充分利用c/c++中的?/title><link>http://www.shnenglu.com/cloud/archive/2008/12/05/68628.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Fri, 05 Dec 2008 02:49:00 GMT</pubDate><guid>http://www.shnenglu.com/cloud/archive/2008/12/05/68628.html</guid><wfw:comment>http://www.shnenglu.com/cloud/comments/68628.html</wfw:comment><comments>http://www.shnenglu.com/cloud/archive/2008/12/05/68628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/cloud/comments/commentRss/68628.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cloud/services/trackbacks/68628.html</trackback:ping><description><![CDATA[c/c++中的宏不是语法中的一部分Q?是在~译器开始编译之前的一U文本替换行为, 因此可以利用c/c++中的~译器中的选项来预处理其他没有预处理功能的语言<br><br>比如Q?利用微Y的cl.exe ~译器来预处理文本, 命oQ?cl.exe /EP test.vb<br>q样如果test.vb中有cM#define 的语句, 会被删除Q?而后一些用到该宏的地方Q?会被真实的值替? <img src ="http://www.shnenglu.com/cloud/aggbug/68628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cloud/" target="_blank">cloud</a> 2008-12-05 10:49 <a href="http://www.shnenglu.com/cloud/archive/2008/12/05/68628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】高效的XML——XDShttp://www.shnenglu.com/cloud/archive/2008/11/12/66725.htmlcloudcloudWed, 12 Nov 2008 07:34:00 GMThttp://www.shnenglu.com/cloud/archive/2008/11/12/66725.htmlhttp://www.shnenglu.com/cloud/comments/66725.htmlhttp://www.shnenglu.com/cloud/archive/2008/11/12/66725.html#Feedback0http://www.shnenglu.com/cloud/comments/commentRss/66725.htmlhttp://www.shnenglu.com/cloud/services/trackbacks/66725.html    最q在游戏~程_a4(Game Programming Gems 4)中看C对于XDS的介l,解开了我对于XML低效的困惑。也许在型的XML应用中不觉得Q但是在大数据量的应用中XML的速度甚至无法和普通的.ini相提q论。首先让我们来看看XDS是什么吧?/div>
 
    XDS技术由DSD和XDS两种文g格式l成。前者跟XSD怼Q后者跟XML怼Q只不过q两U格式都是二q制的。正是采用了二进制格式,无论是在体积q是在速度上XDS的性能比XML都有明显的提升。目前支持XDS的免费库主要有XDSToolkitQ现在可以下载到1.03版本。这是一个开源项目,解压后我们可以看到它׃个工具一个API包组成,另外q附一个例子。两个工L名字分别叫做xdsConvert和xdsMakeSchemaQ分别是用来q行XML和XDS怺转换Q以及生成DSD文g的?/div>
 
    在一个C/C++目中,我们l常需要用struct定义一pd数据l构。xdsMakeSchema可以通过输入数据l构的定义文?h来生成DSD和相应的c头文件。在一个项目的初期Q你可能需要用XML~辑器来~写q个目所需要的XML数据Q然后在E序中通过XDSLiteAPI来进行解析。这套API有两个PaserQ一个服务于XMLQ另一个服务于XDS。当你的目完全可以自动生成XML的时候就可以由XML转向XDS了。游戏编E精_中解释的很详细Q这边就说说需要注意的地方了?/div>
 
    要利用API对XDSq行解析需要以下步骤:
?    以struct定义的C数据cd
?    XDS的数据类型定义,可以在DSD中,也可以在E序中定?/div>
?    回调函数的编写,主要是XDS_PROCESSNODE函数
 
以该工具包附带的PowerupZQstruct看v来是q样的:
struct PowerUp_t {
    char szName[10];        // display name
    char szImage[16];       // image file name
 
    // health increase/decrease (-128 to 127)
    signed char   iHealth;
 
    // temporary abilities/penalties
    // (value is duration in seconds)
    unsigned char iInvulnerability;
    unsigned char iFastMove;
    unsigned char iHighJump;
    unsigned char iStunPlayer;
 
    // extra life (count)
    unsigned char iLifeUp;
};
 
// global power-up definition cache
extern struct PowerUp_t *g_PowerUps;
 
可以通过使用xdsMakeSchema来生成dsdQ同时生成的xxxx_dsd.h只是Z免除dsd文gd内存Q查看它的内容就可以看到它定义了一个dsd数组Q?/div>
// XDS DSD literal -- use this in calls to xdsInit()
//
#ifdef DEFINE_DSD
 
const unsigned char XDSDSD_Powerups[216] = {
    0x58, 0x44, 0x53, 0x21, 0x30, 0x33, 。。?/div>
};
 
#else
 
extern const unsigned char XDSDSD_Powerups[216];
 
#endif
 
 
// XDS DSD IDs -- use these in implementation of XDS_PROCESSNODE()
//
#define XDS_Powerups_Powerup    0x0100 // Record
#define XDS_Powerups_PowerUp_t 0x0101 // Type
#define XDS_Powerups__xdsType1 0x0102 // Type
#define XDS_Powerups_g_PowerUps 0x0103 // Element
 
同时q定义了一些常量,q些帔R在解析xds中会用到?/div>
除了在dsd中对于xds格式的定义之外,我们q可以在main.cpp中看到程序内的定义:
#ifdef XDS_SUPPORT_DEFTYPE
void regDsd(struct xdsHandle *hXds)
{
    // Register my types (test only)
 
    xdsDefRecord(hXds, "Powerup", 2);
 
    unsigned short iStructType = xdsDefStructType(hXds, "PowerUp_t");
    xdsDefStructField(hXds, iStructType, "szName", XDS_TYPE_CHAR, 10);
    xdsDefStructField(hXds, iStructType, "szImage", XDS_TYPE_CHAR, 16);
    xdsDefStructField(hXds, iStructType, "iHealth", XDS_TYPE_CHAR, 0);
xdsDefStructField(hXds, iStructType, "iInvulnerability", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iFastMove", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iHighJump", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iStunPlayer", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iLifeUp", XDS_TYPE_BYTE, 0);
 
    xdsDefStructDone(hXds, iStructType);
    unsigned short iArrayType = xdsDefArrayType(hXds, "_xdsType1", iStructType, 0, 2);
 
    xdsDefElement(hXds, "g_PowerUps", iArrayType, 0);
}
#endif
 
    注意Q交叉用dsd定义和程序定义容易造成一个错误,是在程序和dsd可能在定义的时候冲H,数据cd冲突Q或者数据长度冲H,从而导致程序的崩溃。附带的例子中程序定义数据类型如下:
#ifdef XDS_SUPPORT_DEFTYPE
void regDsd(struct xdsHandle *hXds)
{
    // Register my types (test only)
 
    xdsDefRecord(hXds, "Powerup", 4);
 
    unsigned short iStructType = xdsDefStructType(hXds, "PowerUp_t");
    xdsDefStructField(hXds, iStructType, "szName", XDS_TYPE_CHAR, 10);
    xdsDefStructField(hXds, iStructType, "szImage", XDS_TYPE_CHAR, 16);
    xdsDefStructField(hXds, iStructType, "iHealth", XDS_TYPE_CHAR, 0);
    xdsDefStructField(hXds, iStructType, "iInvulnerability", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iFastMove", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iHighJump", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iStunPlayer", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iLifeUp", XDS_TYPE_BYTE, 0);
 
    xdsDefStructDone(hXds, iStructType);
    unsigned short iArrayType = xdsDefArrayType(hXds, "_xdsType1", iStructType, 0, 2);
 
    xdsDefElement(hXds, "g_PowerUps", iArrayType, 0);
}
#endif
 
要是在生成dsd时用参数-r Powerup:2而这里用xdsDefRecord(hXds, "Powerup", 4)的话׃D冲突?/div>

cloud 2008-11-12 15:34 发表评论
]]>[转]游戏Entity设计不完全整?/title><link>http://www.shnenglu.com/cloud/archive/2008/01/09/40796.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Wed, 09 Jan 2008 07:14:00 GMT</pubDate><guid>http://www.shnenglu.com/cloud/archive/2008/01/09/40796.html</guid><wfw:comment>http://www.shnenglu.com/cloud/comments/40796.html</wfw:comment><comments>http://www.shnenglu.com/cloud/archive/2008/01/09/40796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/cloud/comments/commentRss/40796.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cloud/services/trackbacks/40796.html</trackback:ping><description><![CDATA[<div id="lhrrfzr" class=postText> <p class=MsoNormal style="TEXT-ALIGN: center"><span style="FONT-FAMILY: 宋体"><span style="FONT-FAMILY: 宋体"><span style="FONT-FAMILY: 宋体">在游戏引擎中Q?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">通常被翻译成实体Q也常用诸如</span><span lang=EN-US>GameObject</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Actor</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>SimulationObject</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Unit</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Character</span><span style="FONT-FAMILY: 宋体">{名字。相比于对图像声韛_擎的热情Q?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">层多q来一直备受冷遇,但最q几q随着大型游戏的发展,</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">层设计的重要性已l达到和囑փ声音的同{水qI而且已经出现了多U通用?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">架构。当Ӟq里伴随着争议和分歧?/span></p> <h3><span style="FONT-FAMILY: 宋体">直接模式Q?/span><span lang=EN-US>The C Approach</span><span style="FONT-FAMILY: 宋体">Q?/span></h3> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">q是最早、最单、也是Q何h都能直接惛_的模式。这U方式下一?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">是一个简单的</span><span lang=EN-US>struct:</span></p> <p class=MsoNormal><span lang=EN-US>struct Mob<br>{<br>int level, hp, mp, attack, …;<br>};</span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">q种情况下往往需要对不同cd?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">定义不同?/span><span lang=EN-US>struct</span><span style="FONT-FAMILY: 宋体">Q比?/span><span lang=EN-US>Player</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Mob</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Item</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Doodad</span><span style="FONT-FAMILY: 宋体">{?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">的数据库可以直接使用现成的数据库pȝ或者从数据文gdQ比?/span><span lang=EN-US>csv</span><span style="FONT-FAMILY: 宋体">文g。一般会选择</span><span lang=EN-US>Excel</span><span style="FONT-FAMILY: 宋体">~辑数据库,然后导出</span><span lang=EN-US>csv</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Excel</span><span style="FONT-FAMILY: 宋体">的强大表格和l计计算功能是调节游戏数据^衡的得力工具。以致这U最古老而简单的</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">模式以强大的生命力一直活到现在?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">那么Z?/span><span lang=EN-US>Developers</span><span style="FONT-FAMILY: 宋体">会要L索其他方式呢Q最大的问题是这U方式下各种</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">完全不同质。比?/span><span lang=EN-US>Player</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Mob</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Doodad</span><span style="FONT-FAMILY: 宋体">都有位置Q都要做撞,但他们却是不同的cdQ不能用同一份代码;</span><span lang=EN-US>Player</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Mob</span><span style="FONT-FAMILY: 宋体">都有</span><span lang=EN-US>hp</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>mp</span><span style="FONT-FAMILY: 宋体">Q也有基本相同的处理逻辑……当然Q这个可以用</span><span lang=EN-US>hack</span><span style="FONT-FAMILY: 宋体">的方法解冻I只要各个</span><span lang=EN-US>struct</span><span style="FONT-FAMILY: 宋体">前若q个成员cd和顺序完全相同,可以将指针</span><span lang=EN-US>cast</span><span style="FONT-FAMILY: 宋体">成统一的一?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">cd来处理。不q,M人都能想到更好的办法Q用c!</span></p> <h3><span style="FONT-FAMILY: 宋体">l承模式Q?/span><span lang=EN-US>Inheritage</span><span style="FONT-FAMILY: 宋体">Q?/span></h3> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">q也?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>GameObject</span><span style="FONT-FAMILY: 宋体">{这些名字的由来Q他们就是基cR于是我们可以得C颗承关pLQ例如:</span></p> <p class=MsoNormal><span lang=EN-US>Entity</span></p> <p class=MsoNormal><span lang=EN-US><span>       </span>Character</span></p> <p class=MsoNormal><span lang=EN-US><span>              </span>Player</span></p> <p class=MsoNormal><span lang=EN-US><span>              </span>Mob</span></p> <p class=MsoNormal><span lang=EN-US><span>       </span>Missile</span></p> <p class=MsoNormal><span lang=EN-US><span>              </span>Laser</span></p> <p class=MsoNormal><span lang=EN-US><span>              </span>GuidedMissile</span></p> <p class=MsoNormal><span lang=EN-US><span>       </span>Item</span></p> <p class=MsoNormal><span lang=EN-US><span>       </span>…</span></p> <p class=MsoNormal><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">对象的逻辑大多也是直接包含在类里的。但也有人采用了数据对象和逻辑对象的分,其好处是对相同的数据可以替换不同的逻辑。不q,个h比较怀疑这U分L否值得Q因为类的派生本w就是可以拥有不同的逻辑?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">另外Q?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">间的交互除了用标准的直接讉K方式外,l常使用消息模式。消息模式和</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体">的消息模式类|</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">间通过消息交互。虽说窗口编E画了多q时间才摆脱了当q肥大的</span><span lang=EN-US>switch</span><span style="FONT-FAMILY: 宋体">的消息处理模式,?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">层用消息模式还是有意义的,因ؓ消息很容易广播且可以直接在网l上发送。执着?/span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体">的h会将消息写成</span><span lang=EN-US>Command</span><span style="FONT-FAMILY: 宋体">对象Q但原理仍然是一L?/span><span lang=EN-US><o:p></o:p></span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">同时Q联|游戏出玎ͼ指针不能在不同的机器上标识对象,我们必须用稳定的</span><span lang=EN-US>ID</span><span style="FONT-FAMILY: 宋体">来标识对象,于是我们有了</span><span lang=EN-US>EntityManager</span><span style="FONT-FAMILY: 宋体">来分?/span><span lang=EN-US>ID</span><span style="FONT-FAMILY: 宋体">和管理对象集合,或者叫</span><span lang=EN-US>GameObjectManager</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>ObjectManager</span><span style="FONT-FAMILY: 宋体">{。这在一D|期内几乎成了完美的方案?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">随着游戏内容的丰富性的q速膨胀Q传l的q序员来实现游戏逻辑功能的模式也来力不从心。脚本语a的集成将大部分创意性工作从E序员的担子上拿了下来,交还l游戏设计h员。ؓ了给脚本提供_的控制权Q?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">l构上必L充分的灵zL?/span></p> <h3><span style="FONT-FAMILY: 宋体">数据驱动Q?/span><span lang=EN-US>Data-Driven</span><span style="FONT-FAMILY: 宋体">Q?/span></h3> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">现在有句很流行的话,“唯一不变的是变化。(</span><span lang=EN-US>The only constant is change.</span><span style="FONT-FAMILY: 宋体">Q?#8221;数据驱动使得变化对引擎的影响最化。数据驱动不能算是一U独立的</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">模式Q不如说它是一U设计思想Q其目的是内容制作和游戏引擎的制作分d来。与上面所说的填充</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">属性数据库的不同之处在于,它还要能通过数据来设计游戏逻辑?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">游戏设计人员需要的一Ҏ基本功能是自定义h物属性,所以与其在c里写死属性成员,不如使用属性表Q?/span><span lang=EN-US>Attributes/Properties</span><span style="FONT-FAMILY: 宋体">Q。通常使用一个哈希表Q?/span><span lang=EN-US>Hashtable</span><span style="FONT-FAMILY: 宋体">Q,或?/span><span lang=EN-US>std::map</span><span style="FONT-FAMILY: 宋体">Q或?/span><span lang=EN-US>Dictionary</span><span style="FONT-FAMILY: 宋体">Q或者就是个数组Q随个h喜好Q其实就是要一?/span><span lang=EN-US>key-value</span><span style="FONT-FAMILY: 宋体">的映表。然后ؓ脚本和编辑器提供对属性表的操作?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">动态的逻辑主要靠脚本了,必须本提供够的事g和方法。个人推荐用</span><span lang=EN-US>Lua</span><span style="FONT-FAMILY: 宋体">脚本Q因为它是在游戏领域内用得最多的通用脚本语言Q其引擎很小、速度很快、易于集成,管语法q于松散。不要迷信宣传去用庞大、极慢、难于集成的</span><span lang=EN-US>Python</span><span style="FONT-FAMILY: 宋体">。ؓ脚本提供事gQ其实也是调用脚本里的函数Q这里如果用了前面所q的消息模式Q那么就只要调用一个脚本方法,传递不同的消息参数p了。当然也有h觉得q样很丑陋而更愿意Z同的事g注册不同的函数?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">当有了数据驱动后Q?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">的承树基本失L义了Q因Z?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">是什么已l不是程序里军_的了Q而是通过数据和脚本设计出来的。但数据和脚本又不是全部Q一?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">的核心内容和需要高效处理的部分Q如撞,q是要程序来完成。于是我们需要重新设?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">c,困难的局面也q此开始?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">一个直观的x是一个统一且唯一?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">c,它包含了所有的基本功能Q如昄、碰撞检、运动、背包等Q然后由数据军_哪些lg被启用。比如一个玩家角色可能会启用l大部分lgQ而一颗树只启用显C和撞组件。但也伴随着~点Q一、这个类太大了;二、对于树木等一些简单的</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">也要费其他lg的私有数据所占的内存。那么一个简单的折中是部分用ѝ部分用数据定制。例?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">只提供最基本的组Ӟ再派生出</span><span lang=EN-US>CharactorEntity</span><span style="FONT-FAMILY: 宋体">提供_人物角色使用的组件?/span></p> <h3><span style="FONT-FAMILY: 宋体">lg模式Q?/span><span lang=EN-US>Component-Based Entity</span><span style="FONT-FAMILY: 宋体">Q?/span></h3> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">提到lgQ那么很自然的就q渡到组件模式,是把显C、运动、攻凅R背包、队伍、声音等基本功能都做成独立的lgQ由数据来决定向</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">里添加哪些组件。由此可以得到另外一个扩展,是既然可以有引擎内|的lgQ那׃可以有脚本制作的lgQ实现脚本模块的复用。这U模式在</span><span lang=EN-US>GDC2002</span><span style="FONT-FAMILY: 宋体">正式提出Q到现在L的引擎都有这U设计?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">q种模式在理Z很完,但实践上q是有不疑问。最常见的问题就是组仉的依赖关pR理x况下Q各个组件是完全独立的,但实践中必然有所依赖。比如运动速度、攻d度等和角色的基本属性有养Iq动lg需要角色的包围盒来试是否撞Q?/span><span lang=EN-US>AI</span><span style="FONT-FAMILY: 宋体">lg需要分析角色当前状态和发出q动、攻d令,角色动作状态变化时改变昄lg属性,dlg需要访问队伍信息组件以止d队友{等。处理这U依赖关pM要要解决两个问题Q?/span></p> <p class=MsoNormal style="MARGIN-LEFT: 19.5pt; TEXT-INDENT: -19.5pt"><!--[if !supportLists]--><span lang=EN-US><span>一?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">              </span></span></span><!--[endif]--><span style="FONT-FAMILY: 宋体">谁依赖谁。比如是敏捷属性改变而去修改Ud速度Q还是运动组件读取敏捷属性来计算Ud速度。如果要游戏设计人员自由定义基本属性的话,p选择前者,因ؓ基本属性组件会是脚本组件?/span></p> <p class=MsoNormal style="MARGIN-LEFT: 19.5pt; TEXT-INDENT: -19.5pt"><!--[if !supportLists]--><span lang=EN-US><span>二?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">              </span></span></span><!--[endif]--><span style="FONT-FAMILY: 宋体">如何取得另一lg的指?/span><span lang=EN-US>/</span><span style="FONT-FAMILY: 宋体">引用。常见的Ҏ是给每个lgcd一个唯一</span><span lang=EN-US>ID</span><span style="FONT-FAMILY: 宋体">Q然后用?/span><span lang=EN-US>ID</span><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">上查询注册了的组Ӟ如果扑ֈq回其指?/span><span lang=EN-US>/</span><span style="FONT-FAMILY: 宋体">引用Q否则返?/span><span lang=EN-US>null</span><span style="FONT-FAMILY: 宋体">。当Ӟ每次讉K都做q个查询会很费</span><span lang=EN-US>CPU</span><span style="FONT-FAMILY: 宋体">Q如?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">的组件不会在q行时动态添加删除的话(除非在编辑器里,否则很少有h会这么做Q,可以?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">初始化后让每个组件缓存它所要用的其他组件指针。那么当所依赖的组件不存在怎么办,一般情况下都是无声地忽略?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">由很多组件组成后Q交互的消息需要发l每一个组件。这里又一ơ体现出消息机制的优势,你不需要在</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">里ؓ每一个事件函数写一?/span><span lang=EN-US>loop</span><span style="FONT-FAMILY: 宋体">来调用组件的相应事g函数。但q里也出C一个问题,消息到达各个lg的顺序。很多时候这个顺序不会有什么媄响,但个别时候不同的序会导致完全不同的逻辑发展方向?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">此外Q?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">的序列化存储也变得比较复杂,l典?/span><span lang=EN-US>Excel</span><span style="FONT-FAMILY: 宋体">导出</span><span lang=EN-US>csv</span><span style="FONT-FAMILY: 宋体">的模式难以奏效,因ؓq里需要结构化的存储,所以需要结构化的数据文件如</span><span lang=EN-US>XML</span><span style="FONT-FAMILY: 宋体">来存储,或者完全用脚本来包含所有数据和构?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">?/span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">据个人经验,使用数据驱动的承模式时很是向往lg模式Q感觉上它一个非常自然的扩展方向Q但ֿ其引入的额外的复杂性,其是需要游戏设计h员具有一定的~程能力Q所以一直不敢全盘接q用。但退一步,在引擎里仍然使用lg思想Q但</span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">的组件构成在~译时固定,可以辑ֈ某种妥协Q这和采用承与数据驱动的折中类伹{?/span></p> <h3><span style="FONT-FAMILY: 宋体">混入模式Q?/span><span lang=EN-US>Mix-in</span><span style="FONT-FAMILY: 宋体">Q?/span></h3> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">q是又一U常见的折中模式Q即使用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体">的多重承,各个组件类混入一?/span><span lang=EN-US>Entity</span><span style="FONT-FAMILY: 宋体">cR如Q?/span></p> <p class=MsoNormal><span lang=EN-US>class Mob: public GameObject, public Renderable, public Movable, public Attackable<br>{<br>…<br>}</span></p> <p class=MsoNormal><span lang=EN-US><o:p></o:p></span><span style="FONT-FAMILY: 宋体">q种Ҏ因其单而且非常W合多重l承设计思想而被很多引擎采用。当然缺点也是只能在支持多重l承的语a里用,而且当组件很丰富Ӟ</span><span lang=EN-US>dynamic_cast</span><span style="FONT-FAMILY: 宋体">变成一个代价高昂的操作?/span><span lang=EN-US><o:p> <br></o:p></span></p> <h3><span style="FONT-FAMILY: 宋体">功能性与复杂性(</span><span lang=EN-US>Functionality vs Complexity</span><span style="FONT-FAMILY: 宋体">Q?/span></h3> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">~程领域最古老的原则之一是?#8220;单快?#8221;。但随着问题的复杂化Q程序也随之变得来复杂。好的方法应该能有效的降低或隐藏复杂性。但是,没有不带副作用的药(</span><span lang=EN-US>No silver bullet.</span><span style="FONT-FAMILY: 宋体">Q,在取得更强大的功能的同时M带来额外的复杂性。我们需要做出权衡,在必要时牺牲一些功能,也就是要估算性h比?/span><br><span lang=EN-US><o:p></o:p></span></p> <p class=MsoNormal><span style="FONT-FAMILY: 宋体">一般游戏内容制作h员不会或不太会编E,~程人员也不善于游戏的内容创造和数值^衡,q于复杂的系l会D需要两面兼儡人才Q会大大增加做出一ƾ游戏的隑ֺ?/span></p> </span></span></div> <img src ="http://www.shnenglu.com/cloud/aggbug/40796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cloud/" target="_blank">cloud</a> 2008-01-09 15:14 <a href="http://www.shnenglu.com/cloud/archive/2008/01/09/40796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc++2005中的异常http://www.shnenglu.com/cloud/archive/2007/11/29/37511.htmlcloudcloudThu, 29 Nov 2007 12:41:00 GMThttp://www.shnenglu.com/cloud/archive/2007/11/29/37511.htmlhttp://www.shnenglu.com/cloud/comments/37511.htmlhttp://www.shnenglu.com/cloud/archive/2007/11/29/37511.html#Feedback0http://www.shnenglu.com/cloud/comments/commentRss/37511.htmlhttp://www.shnenglu.com/cloud/services/trackbacks/37511.html

cloud 2007-11-29 20:41 发表评论
]]>
lua的远E调?/title><link>http://www.shnenglu.com/cloud/archive/2007/10/20/34673.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Sat, 20 Oct 2007 04:18:00 GMT</pubDate><guid>http://www.shnenglu.com/cloud/archive/2007/10/20/34673.html</guid><wfw:comment>http://www.shnenglu.com/cloud/comments/34673.html</wfw:comment><comments>http://www.shnenglu.com/cloud/archive/2007/10/20/34673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/cloud/comments/commentRss/34673.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cloud/services/trackbacks/34673.html</trackback:ping><description><![CDATA[q几天一直在找lua的远E调试, l于扑ֈ一个LuaPlus和remdebugQ?在此做个标记 <img src ="http://www.shnenglu.com/cloud/aggbug/34673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cloud/" target="_blank">cloud</a> 2007-10-20 12:18 <a href="http://www.shnenglu.com/cloud/archive/2007/10/20/34673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]C++资源之不完全导引Q完整版Q?http://www.shnenglu.com/cloud/archive/2007/05/25/24835.htmlcloudcloudFri, 25 May 2007 08:39:00 GMThttp://www.shnenglu.com/cloud/archive/2007/05/25/24835.htmlhttp://www.shnenglu.com/cloud/comments/24835.htmlhttp://www.shnenglu.com/cloud/archive/2007/05/25/24835.html#Feedback0http://www.shnenglu.com/cloud/comments/commentRss/24835.htmlhttp://www.shnenglu.com/cloud/services/trackbacks/24835.html C++资源之不完全导引Q完整版Q?/font>

C++资源之不完全导引Q完整版Q?/p>

来源Q?a >www.csdn.net

撰文Q曾毅、陶?/p>

声明Q本?004q?月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社
所有?/p>

------------------------------------------------------------------------
--------

  1Q前a

  无数ơ听?#8220;我要开始学习C++!”的呐喊,无数ơ听?#8220;C++太复杂了Q我真的
学不?#8221;的无奈。Stan Lippman先生曑֜《C++ Primer》一书中指出“C++是最为难
学的高E序设计语言之一”Qh们常?#8220;之一”L以表达自己对C++的敬畏。诚
ӞC++E序设计语言对于学习者的有很多难以逾越的`沟,体系l构的庞大,?br>接不暇ƈ不断扩充的特?#8230;…除此之外Q参考资料之多与冗杂使它的学习者望而却
步,Ʋ求深入者苦不堪a。希望这一份不完全导引能够成ؓ您C++学习之\上的引\
灯?/p>

  撰写本文的初衷ƈ不打带领大家体验古老的C++历史Q如果你想了解C++的历
史与其前期发展中诸多技术的演变Q你应当d考Bjarne的《The Design and Evo
lution of C++》。当然也不打给大家一个无所不包的宝典(q不想Q其一是因
水^有限Q其二无奈C++之博大精深)Q所l出的仅仅是一些我们认为对于想学习C
++的广大读者来说最重要q且触手可及的开发与学习资源?/p>

  本文介绍q分析了一些编译器Q开发环境,库,量的书c以及参考网站,q?br>且尽可能试着l出一个利用这些资源的导引Q望对如同我们一L初学者能够有
所裨益?/p>

------------------------------------------------------------------------
--------

  2Q编译器

  在C++之外的Q何语a中,~译器都从来没有受到q如此之重视。因为C++是一
门相当复杂的语言Q所以编译器也难于构建。直到最q我们才开始能够用上完全
W合C++标准的编译器Q哦Q你可能会责怪那些编译器厂商不能早的提供符合标?br>的编译器Q这只能怪他们各自维pȝ自n的一套别Z愿接受的标准Q。什么??br>说这无关紧要Q哦Q不Q你所需要的是和标准化C++高度兼容的编译环境。长q来?br>Q只有这L~译器对C++开发h员来说才是最有意义的工具Q尤其是对于E序设计
语言的学习者。一x让代码具备可移植性,q让一门语a及其库的应用更ؓq泛
。嗯Q是的,我们q里只打介l一些公认的优秀~译器?/p>

  2.1 Borland C++

  q个是Borland C++ Builder和Borland C++ Builder Xq两U开发环境的后台
~译器。(哦,我之所以将之分ZU开发环境你应当能明白ؓ什么,正如Delphi
7到Delphi8的{变,是革命性的两代。)Borland C++p牌开发工具厂商Borland
們֊打造。该公司的编译器素以速度快,I间效率高著UͼBorland C++ pd~译
器秉承了q个传统Q属于非怼质的~译器。标准化斚w早在5.5版本的编译器中对
标准化C++的兼容就辑ֈ?2.73%。目前最新版本是Borland C++ Builder X中的6.
0版本Q官方称100%W合ANSI/ISO的C++标准以及C99标准。嗯…q正是我前面所指的
“完全W合C++标准的编译器”?/p>

  2.2 Visual C++

  q个正是我们熟知的Visual Studio ?Visual Studio.net 2002, 2003以及2
005 Whidbey中带的C++~译器。由Microsoft公司研制。在Visual Studio 6.0中,
因ؓ~译器有太多地方不能与后来出现的C++标准相吻合而饱受批评(x你在使用
STL的时候编译时报出的那些o人厌恶的error和warning吧)。VC++6.0Ҏ准化C+
+的兼容只?3.43%。但是随着C++~译器设计大师Stanley Lippman以及诸多C++C?br>达人的加盟Q在Visual Studio.NET 2003中,Visual C++~译器已l成Z个非
常成熟可靠的C++~译器了。Dr.Dobb's Journal的评显CVisual C++7.1Ҏ准C
++的兼Ҏ高?8.22%Q一度成为CBX之前兼容性最好的~译器。结合强大的Visua
l Studio.NET开发环境,是一个非怸错的选择。至于Whidbey时代的Visual C++,
g微Y所最x的是C++/CLI……我们不想评论微Y下一代的C++~译器对标准?br>兼容如何Q但他确实越来越适合.NET (其实你和我的感觉可能是一LQ微软不?br>当把标准C++q块肥肉丢给Borland,然而微软可能ƈ不这栯??/p>

  2.3 GNU C++

  著名的开源C++~译器。是cUnix操作pȝ下编写C++E序的首选。特Ҏ有非
常好的移植性,你可以在非常q泛的^C使用它,同时也是~写跨^収ͼ嵌入?br>E序很好的选择。另外在W合标准q个斚w一直都非常好,GCC3.3大概能够辑ֈ96
.15%。但是由于其跨^台的Ҏ,在代码尺寔R度{优化上略微差一炏V?/p>

  ZGNU C++的编译器有很多,比如Q?/p>

  (1) Mingw

  http://www.mingw.org/

  GCC的一个Windows的移植版本(Dev-C++的后収ͼ

  (2) Cygwin

  http://sources.redhat.com/cygwin/

  GCC的另外一个WindowsUL版本是Cygwin的一部分QCygwin是Windows下的一?br>Unix仿真环境。严格的说是模拟GNU的环境,q也是"Gnu's Not Unix"要表辄?br>思,噢,扯远了,qƈ不是我们在这里关心的实质内容?/p>

  (3) Djgpp

  http://www.delorie.com/djgpp/

  q是GCC的DOSUL版本?/p>

  (4) RSXNT

  http://www.mathematik.uni-bielefeld.de/~rainer/

  q是GCC的DOS和WindowsUL版本?/p>

  (5) Intel C++

  著名CPU刉厂商Intel出品的编译器QSpecial Design for Intel x86Q对?br>Intel x86l构的CPUl过特别的优化。在有些应用情况下,特别是数D等高?br>能应用,仅仅采用Intel的编译器~译p大幅度的提高性能?/p>

  (6) Digital Mars C++

  |络上提供免费下载,Zortech/Symantec C++的承者,其前w在当年惨烈?br>C++四国战中也是主角之一?/p>

------------------------------------------------------------------------
--------

  3Q开发环?/p>

  开发环境对于程序员的作用不a而喻。选择自己朝夕相处的环境也不是Ҏ?br>事情Q特别是在IDE如此丰富的情况下。下面就是我们推荐的一些常见的C++开发环
境,q没有包括一些小型的Q罕见的IDE。其中Q何一N是功能丰富,可以用作?br>常开发用的。对于不同层面的开发者,请参见内文关于适用对象的描q?/p>

  3.1 Visual Studio 6.0

  q个虽然是Microsoft公司的老版本的开发环境,但是鉴于其后l版本Visual
Studio.NET的庞大nw,以及初学者ƈ不那么高的功能要求,所以推荐这个开发环
境给C++的初学者,供其学习C++的最基本的部分,比如C的那部分子集Q当然你别指
望他能够支持最新的C99标准。在日常的开发中Q仍然有很多公司使用q个l典E_
的环境,比如W者就看曾亲见有些公司其~译器替换ؓGCC做手机开发之用?/p>

  3.2 Visual Studio.NET 2003

  作ؓMicrosoft公司官方正式发布的最新版本开发环境,其中有太多激动h心的
功能。结合其最新的C++~译器。对于机器配|比较好的开发h员来_使用q个开
发环境将能满_大部分的要求。这里不打算单独说Visual Studio Whidbey,虽然
Visual Studio .NET 2005 - WhidbeyC֌预览版已l推出,但暂不是很稳定,读?br>可以亲nM验?/p>

  3.3 Borland C++ Builder 6

  q个q不是Borland的C++开发环境的最新版本。选择它的原因是它不是用Java
写的IDEQ速度比较快。它有一个很完善的GUIH体设计器,和Delphiq一个VCL?br>׃q些特点Q比较适合初学者上手。但是由于其GUI的中心位|,可能不利于对?br>C++语言的学习。而且其ؓ了支持VCLq个Object Pascal写的库也对C++q行了一?br>U有的扩充。得h们有一个不得不接受的事实:“Borland C++ Builder 6的高?br>几乎都是Delphi高手”?/p>

  3.4 Borland C++ Builder X

  正如前文所qͼ虽然版本号上和前面那个IDE非常相象Q但是其实它们是完全?br>同的两个集成开发环境。C++Builder更多的是一个和Delphi同步的C++版本的开发环
境,C++BuilderX则是完全从C++的角度思考得出的一个功能丰富的IDE。其最大的?br>Ҏ跨^収ͼ跨编译器Q多UFramework的集成,q且有一个WxWindows为基的GU
I设计器。尤其是采用了纯C++来重写了整个Framework,摒弃了以前o人无奈的版本
。对于C++的开发来_从编译器Q到库,到功能集成都是非常理想的。可以预见,
Borland C++ Builder X 2.0很值得C++爱好者期待。唯一令h隑֠之处是作Z?br>C++的开发工P其IDE是用Java写的Q在配置不够理想的机器上h重考虑再安?br>?/p>

  3.5 Emacs + GCC

  前面讲的大部分是Windows环境下的集成开发环境。Linux上的开发者更們֐?br>使用Emacs来编辑C++的文Ӟ用Makefile来命令GCC做编译。虽然看上去比较松散Q?br>但是q些东西l合hq是一个开0发环境。如果你能够娴熟的用这L环境写程
序,你的水^应该_指导我们来写q篇陋文了?/p>

  3.6 Dev C++

  GCC是一个很好的~译器。在Windows上的C++~译器一直和标准有着一D距ȝ
时候,GCC是一个让Windows下开发者流口水的编译器。Dev-C++是能够让GCC?br>在Windows下的工具Q作为集成开发环境,q提供了同专业IDE相媲的语法高亮Q?br>代码提示Q调试等功能。由于用Delphi开发,占用内存,速度很快Q比较适合
轻量U的学习和用?/p>

  3.7 Eclipse + CDT

  Eclipse可是q来大名鼎鼎的开发工兗最C期的Jolt大奖颁l了q个杰出
的神物。说其神奇是因ؓQ它本n是用Java写的Q但是拥有比一般Java写的E序?br>得多的速度。而且因ؓ其基于插件组装一切的原则Q得能够有CDTq样的插件把E
clipse变成一个C/C++的开发环境。如果你一直用Eclipse写Java的程序,不妨用它
体验一下C++开发的乐趣?/p>

------------------------------------------------------------------------
--------

  4Q工?/p>

  C++的辅助工L多,我们分门别类的ؓ大家作介l:

  4.1 文档c?/p>

  (1) Doxygen

  参考站点:http://www.doxygen.org

  Doxygen是一U适合C风格语言Q如C++、C、IDL、Java甚至包括C#和PHPQ的?br>开放源码的、基于命令行的文档生器?/p>

  (2) C++2HTML

  参考站点:http://www.bedaux.net/cpp2html/

  把C++代码变成语法高亮的HTML

  (3) CodeColorizer

  参考站点:http://www.chami.com/colorizer/

  它能把好几种语言的源代码着色ؓHTML

  (4) Doc-O-Matic

  参考站点:http://www.doc-o-matic.com/

  Doc-O_MaticZ的C/C++QC++.netQDelphi/Pascal, VB.NETQC#和JavaE序
或者组件生准的文档。Doc-O-Matic使用源代码中的符号和注释以及外部的文?br>文g创徏与流行的文档样式一致的文档?/p>

  (5) DocVizor

  参考站点:http://www.ucancode.net/Products/DocBuilder/Features.htm

  DocVizor满了面向对象Y件开发者的基本要求——它让我们能够看到C++工程
中的cdơ结构。DocVizor快速地产生完整可供打印的类层次l构图,包括从第?br>方库中来的那些类Q除此之外DocVizorq能从类信息中生HTML文g?/p>

  (6) SourcePublisher C++

  参考站点:http://www.scitools.com/sourcepublisher_c.html

  l源代码产生提供快速直观的HTML报表Q包括代码,cdơ结构,调用和被?br>用树Q包含和被包含树。支持多U操作系l?/p>

  (7) Understand

  参考站点:http://www.scitools.com/ucpp.html

  分析M规模的C或者C++工程Q帮助我们更好的理解以及~写文档?/p>

  4.2 代码c?/p>

  (1) CC-Rider

  参考站点:http://www.cc-rider.com

  CC-Rider是用于C/C++E序强大的代码可视化工具Q通过交互式浏览、编辑及?br>动文件来促进E序的维持和发展?/p>

  (2) CodeInspect

  参考站点:http://www.yokasoft.com/

  一U新的C/C++代码分析工具。它查我们的源代码找出非标准的,可能的,?br>及普通的错误代码?/p>

  (3) CodeWizard

  参考站点:http://www.parasoft.com

  先进的C/C++源代码分析工P使用过500个编码规范自动化地标明危险的Q?br>但是~译器不能检查到的代码结构?/p>

  (4) C++ Validation Test Suites

  参考站点:http://www.plumhall.com/suites.html

  一l用于测试编译器和库对于标准dE度的代码库?/p>

  (5) CppRefactory

  参考站点:http://cpptool.sourceforge.net/

  CPPRefactory是一个得开发者能够重构他们的C++代码的程序。目的是使得C
++代码的重构能够尽可能的有效率和简单?/p>

  (6) Lzz

  参考站点:http://www.lazycplusplus.com/

  Lzz是一个自动化许多C++~程中的体力zȝ工具。它能够节省我们许多事gq?br>且得编码更加有乐趣。给Zpd的声明,Lzz会给我们创徏头文件和源文件?/p>

  (7) QA C++ Generation 2000

  参考站点:http://www.programmingresearch.com/solutions/qacpp.htm

  它关注面向对象的C++源代码,Ҏ关于设计Q效率,可靠性,可维护性的部分
提出警告信息?/p>

  (8) s-mail project - Java to C++DOL

  参考站点:http://sadlocha.strefa.pl/s-mail/ja2dol.html

  把Java源代码翻译ؓ相应的C++源代码的命o行工兗?/p>

  (9) SNIP from Cleanscape Software International

  参考站点:http://www.cleanscape.net/stdprod/snip/index.html

  一个填q编码和设计之间沟壑的易于用的C++开发工P节省大量~辑和调?br>的事Ӟ它还使得开发者能够指定设计模式作为对象模型,自动从对象模型中产生
C++的类?/p>

  (10) SourceStyler C++

  参考站点:http://www.ochresoftware.com/

  对C/C++源代码提供完整的格式化和排版控制的工兗提供多?5个的格式化?br>以及完全支持ANSI C++?/p>

  4.3 ~译c?/p>

  (1) Compilercache

  参考站点:http://www.erikyyy.de/compilercache/

  Compilercache是一个对你的C和C++~译器的装脚本。每ơ我们进行编译,?br>装脚本,把编译的l果攑օ~存Q一旦编译相同的东西Q结果将从缓存中取出而不
是再ơ编译?/p>

  (2) Ccache

  参考站点:http://ccache.samba.org/

  Ccache是一个编译器~存。它使用h像C/C++~译器的~存预处理器Q编?br>速度通常能提高普通编译过E的5~10倍?/p>

  (3) Cmm (C++ with MultiMethods)

  参考站点:http://www.op59.net/cmm/cmm-0.28/users.html

  q是一UC++语言的扩展。读入Cmm源代码输出C++的源代码Q功能是对C++语言
d了对multimethod的支持?/p>

  (4) The Frost Project

  参考站点:http://frost.flewid.de/

  Forst使得你能够在C++E序中像原生的C++Ҏ一样用multimethod以及虚函
数参数。它是一个编译器的外壟?/p>

  4.4 试和调试类

  (1) CPPUnit

  CppUnit 是个Z LGPL 的开源项目,最初版本移植自 JUnitQ是一个非怼
U的开源测试框架。CppUnit ?JUnit 一样主要思想来源于极限编E。主要功能就
是对单元试q行理Qƈ可进行自动化试?/p>

  (2) C++Test

  参考站点:http://www.parasoft.com/

  C++ Test是一个单元测试工P它自动化了C和C++c,函数或者组件的试?/p>


  (3) Cantata++

  参考站点:http://www.iplbath.com/products/tools/pt400.shtml

  设计的目的是Z满在合理的l济开销下用这个工具可以让开发工E师开
展单元测试和集成试的需?

  (4) Purify

  参考站点:http://www-900.ibm.com/cn/software/rational/products/purif
yplus/index.shtml

  IBM Rational PurifyPlus是一套完整的q行时分析工P旨在提高应用E序?br>可靠性和性能。PurifyPlus内存错误和泄漏、应用程序性能描述、代码覆?br>分析{功能组合在一个单一、完整的工具包中?/p>

  (5) BoundsChecker

  BoundsChecker是一个C++q行旉误检和调试工具。它通过在Visual Studi
o内自动化调试q程加速开发ƈ且羃短上市的周期。BoundsChecker提供清楚Q详l?br>的程序错误分析,许多是对C++独有的ƈ且在staticQstack和heap内存中检和?br>断错误,以及发现内存和资源的泄漏。  (6) Insure++

  参考站点:http://www.parasoft.com/

  一个自动化的运行时E序试工具Q检查难以察觉的错误,如内存覆盖,内存?br>漏,内存分配错误Q变量初始化错误Q变量定义冲H,指针错误Q库错误Q逻辑?br>误和法错误{?/p>

  (7) GlowCode

  参考站点:http://www.glowcode.com/

  GlowCode包括内存泄漏查,code profilerQ函数调用跟t等功能。给C++开
发者提供完整的错误诊断Q和q行时性能分析工具包?/p>

  (8) Stack Spy

  参考站点:http://www.imperioustech.com/

  它能捕捉stack corruption, stack over run, stack overflow{有x的错
误?/p>

------------------------------------------------------------------------
--------

  5Q库

  在C++中,库的C是非帔R的。C++之父 Bjarne Stroustrup先生多次表示?br>设计库来扩充功能要好q设计更多的语法的言论。现实中QC++的库门类J多Q解?br>的问题也是极其广泛,库从轻量U到重量U的都有。不都是让人眼界大开Q亦?br>是望而生叹的思维C。由于库的数量非常庞大,而且限于W者水qI其中很多q?br>不了解。所以文中所提的一些库都是比较著名的大型库?/p>

  5.1 标准?/p>

  标准库中提供了C++E序的基本设施。虽然C++标准库随着C++标准折腾了许多年
Q直到标准的出台才正式定型,但是在标准库的实C却很令hƣ慰得看到多U实
玎ͼq且已被实践证明为有工业U别强度的佳作?/p>

  (1) Dinkumware C++ Library

  参考站点:http://www.dinkumware.com/

  P.J. Plauger~写的高品质的标准库。P.J. Plauger博士是Dr. Dobb'sE序?br>计杰出奖的获得者。其~写的库长期被Microsoft采用Qƈ且最qBorland也取得了
其OEM的licenseQ在其C/C++的品中采用Dinkumware的库?/p>

  (2) RogueWave Standard C++ Library

  参考站点:http://www.roguewave.com/

  q个库在Borland C++ Builder的早期版本中曄被采用,后来被其他的库给?br>换了。笔者不推荐使用?/p>

  (3) SGI STL

  参考站点:http://www.roguewave.com/

  SGI公司的C++标准模版库?/p>

  (4) STLport

  参考站点:http://www.stlport.org/

  SGI STL库的跨^台可UL版本?/p>

  5.2 “?#8221;标准?- Boost

  参考站点:http://www.boost.org

  国内镜像Q?a >http://www.c-view.org/tech/lib/boost/index.htm

  Boost库是一个经q千锤百点{可UL、提供源代码的C++库,作ؓ标准库的?br>备,是C++标准化进E的发动Z一?Boost库由C++标准委员会库工作l成员发?br>Q在C++C֌中媄响甚大,其成员已q?000人?Boost库ؓ我们带来了最新、最酗?br>最实用的技术,是不折不扣的“?#8221;标准库?/p>

  Boost中比较有名气的有q么几个库:

  Regex

  正则表达式库

  Spirit

  LL parser frameworkQ用C++代码直接表达EBNF

  Graph

  囄件和法

  Lambda

  在调用的地方定义短小匿名的函数对象,很实用的functional功能

  concept check

  查泛型编E中的concept

 

  Mpl

  用模板实现的元编E框?/p>

 

  Thread

  可移植的C++多线E库

 

  Python

  把C++cd函数映射到Python之中

  Pool

  内存池管?/p>

 

  smart_ptr

  5个智能指针,学习指针必读Q一份不错的参考是来自CUJ的文章:

  Smart Pointers in BoostQ哦Q这文章可以查刎ͼCUJ是提供在U浏览的?br>中文版见W者在《Dr. Dobb's Journal软g研发杂志》第7辑上的译文?/p>

  BoostM来说是实用h值很高,质量很高的库。ƈ且由于其对跨q_的强调,
Ҏ准C++的强调,是编写^台无养ICC++的开发者必备的工具。但是Boost中也
有很多是实验性质的东西,在实际的开发中实用需要}慎。ƈ且很多Boost中的库功
能堪U对语言功能的扩展,其构造用精巧的手法Q不要N然的p旉研读。Bo
ost另外一面,比如Graphq样的库则是h工业强度Q结构良好,非常值得研读?br>_֓代码Qƈ且也可以攑ֿ的在产品代码中多多利用?/p>

  5.3 GUI

  在众多C++的库中,GUI部分的库是比较J荣Q也比较引h注目的。在实际开
发中QGUI库的选择也是非常重要的一件事情,下面我们lD一下可选择的GUI库,
各自的特点以及相兛_L支持?/p>

  (1) MFC

  大名鼎鼎的微软基cdQMicrosoft Foundation ClassQ。大凡学qVC++?br>人都应该知道q个库。虽然从技术角度讲QMFC是不大漂亮的Q但是它构徏于Windo
ws API 之上Q能够ɽE序员的工作更容?~程效率高,减少了大量在建立 Windo
ws E序时必ȝ写的代码Q同时它q提供了所有一?C++ ~程的优点,例如l承
和封装。MFC ~写的程序在各个版本的Windows操作pȝ上是可移植的Q例如,?br>Windows 3.1下编写的代码可以很容易地UL?Windows NT ?Windows 95 上。但
是在最q发展以及官Ҏ持上日渐势微?/p>

  (2) QT

  参考网站:http://www.trolltech.com/

  Qt是Trolltech公司的一个多q_的C++囑Ş用户界面应用E序框架。它提供l?br>应用E序开发者徏立艺术的图形用L面所需的所用功能。Qt是完全面向对象的
很容易扩展,q且允许真正地组件编E。自?996q早些时候,Qtq入商业领域Q?br>它已l成为全世界范围内数千种成功的应用程序的基础。Qt也是行的Linux桌面?br>境KDE 的基Q同时它q支持Windows、Macintosh、Unix/X11{多U^台?/p>

  (3) WxWindows

  参考网站:http://www.wxwindows.org/

  跨^台的GUI库。因为其cdơ极像MFCQ所以有文章介绍从MFC到WxWindows?br>代码UL以实现跨q_的功能。通过多年的开发也是一个日完善的GUI库,支持?br>样不׃前面两个库。ƈ且是完全开放源代码的。新q的C++ Builder X的GUI设计
器就是基于这个库的?/p>

  (4) Fox

  参考网站:http://www.fox-toolkit.org/

  开放源代码的GUI库。作者从自己亲n的开发经验中得出了一个理想的GUI库应
该是什么样子的感受出发Q从而开始了对这个库的开发。有兴趣的可以尝试一下?/p>


  (5) WTL

  ZATL的一个库。因Z用了大量ATL的轻量手法Q模板等技术,在代码尺
寸,以及速度优化斚w做得非常C。主要面向的使用体是开发COM轻量U供|络
下蝲的可视化控g的开发者?/p>

  (6) GTK

  参考网站:http://gtkmm.sourceforge.net/

  GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnomeq样的杀手应用?br>而GTK是q个库的C++装版本?/p>

  5.4 |络通信

  (1) ACE

  参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html

  C++库的代表Q超重量U的|络通信开发框架。ACE自适配通信环境QAdaptive
 Communication EnvironmentQ是可以自由使用、开放源代码的面向对象框Ӟ?br>其中实现了许多用于ƈ发通信软g的核心模式。ACE提供了一l丰富的可复用C++?br>装外观(Wrapper FacadeQ和框架lgQ可跨越多种q_完成通用的通信软gd
Q其中包括:事g多\分离和事件处理器分派、信号处理、服务初始化、进E间?br>信、共享内存管理、消息\由、分布式服务动态(重)配置、ƈ发执行和同步Q等
{?/p>

  (2) StreamModule

  参考网站:http://www.omnifarious.org/StrMod/

  设计用于化编写分布式E序的库。尝试着使得~写处理异步行ؓ的程序更?br>易,而不是用同步的外壛_起异步的本质?/p>

  (3) SimpleSocket

  参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

  q个cd让编写基于socket的客?服务器程序更加容易?/p>

  (4) A Stream Socket API for C++

  参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h
tml

  又一个对Socket的封装库?/p>

  5.5 XML

  (1) Xerces

  参考网站:http://xml.apache.org/xerces-c/

  Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证Q以及SAX和DOM API
。XML验证在文档类型定?Document Type DefinitionQDTD)斚w有很好的支持Q?br>q且?001q?2月增加了支持W3C XML Schema 的基本完整的开放标准?/p>

  (2) XMLBooster

  参考网站:http://www.xmlbooster.com/

  q个库通过产生特制的parser的办法极大的提高了XML解析的速度Qƈ且能够
生相应的GUIE序来修改这个parser。在DOM和SAX两大LXML解析办法之外提供?br>另外一个可行的解决Ҏ?/p>

  (3) Pull Parser

  参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/

  q个库采用pullҎ的parser。在每个SAX的parser底层都有一个pull的parse
rQ这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得试?/p>


  (4) Xalan

  参考网站:http://xml.apache.org/xalan-c/

  Xalan是一个用于把XML文档转换为HTMLQ纯文本或者其他XMLcd文档的XSLT?br>理器?/p>

  (5) CMarkup

  参考网站:http://www.firstobject.com/xml.htm

  q是一U用EDOM的XML解析器。在很多思\上面非常灉|实用。值得大家在D
OM和SAX之外L一点灵感?/p>

  (6) libxml++

  http://libxmlplusplus.sourceforge.net/

  libxml++是对著名的libxml XML解析器的C++装版本

  5.6 U学计算

  (1) Blitz++

  参考网站:http://www.oonumerics.org/blitz/

  Blitz++ 是一个高效率的数D函数库Q它的设计目的是希望建立一套既?br>像C++ 一h便,同时又比Fortran速度更快的数D环境。通常Q用C++所写出
的数值程序,?Fortran?0%左右Q因此Blitz++正是要改掉这个缺炏V方法是?br>用C++的template技术,E序执行甚至可以比Fortran更快。Blitz++目前仍在发展?br>Q对于常见的SVDQFFTsQQMRES{常见的U性代数方法ƈ不提供,不过使用者可?br>很容易地利用Blitz++所提供的函数来构徏?/p>

  (2) POOMA

  参考网站:http://www.codesourcery.com/pooma/pooma

  POOMA是一个免费的高性能的C++库,用于处理q行式科学计。POOMA的面向对
象设计方便了快速的E序开发,对ƈ行机器进行了优化以达到最高的效率Q方便在
工业和研I环境中使用?/p>

  (3) MTL

  参考网站:http://www.osl.iu.edu/research/mtl/

  Matrix Template Library(MTL)是一个高性能的泛型组件库Q提供了各种格式
矩阵的大量线性代数方面的功能。在某些应用使用高性能~译器的情况下,比如In
tel的编译器Q从产生的汇~代码可以看出其与手写几乎没有两L效能?/p>

  (4) CGAL

  参考网站:www.cgal.org

  Computational Geometry Algorithms Library的目的是把在计算几何斚w的大
部分重要的解x案和Ҏ以C++库的形式提供l工业和学术界的用户?/p>

  5.7 游戏开?/p>

  (1) Audio/Video 3D C++ Programming Library

  参考网站:http://www.galacticasoftware.com/products/av/

  ***3D是一个跨q_Q高性能的C++库。主要的Ҏ是提供3D囑ŞQ声效支持(S
B,以及S3MQ,控制接口Q键盘,鼠标和遥感)QXMS?/p>

  (2) KlayGE

  参考网站:http://home.g365.net/enginedev/

  国内游戏开发高手自qC++开发的游戏引擎。KlayGE是一个开放源代码、跨q?br>台的游戏引擎Qƈ使用Python作脚本语a。KlayGE在LGPL协议下发行。感谢龚敏敏
先生Z国游戏开发事业所做出的A献?/p>

  (3) OGRE

  参考网站:http://www.ogre3d.org

  OGREQ面向对象的囑Ş渲染引擎Q是用C++开发的Q用灵zȝ面向对象3D引擎
。它的目的是让开发者能更方便和直接地开发基?Dg讑֤的应用程序或游戏?br>引擎中的cdҎ底层的系l库Q如QDirect3D和OpenGLQ的全部使用l节q行?br>抽象Qƈ提供了基于现实世界对象的接口和其它类?/p>

  5.8 U程

  (1) C++ Threads

  参考网站:http://threads.sourceforge.net/

  q个库的目标是给E序员提供易于用的c,q些c被l承以提供在Linux环境
中很隄到的大量的线E方面的功能?/p>

  (2) ZThreads

  参考网站:http://zthread.sourceforge.net/

  一个先q的面向对象Q跨q_的C++U程和同步库?/p>

  5.9 序列?/p>

  (1) s11n

  参考网站:http://s11n.net/

  一个基于STL的C++库,用于序列化PODQSTL容器以及用户定义的类型?/p>

  (2) Simple XML Persistence Library

  参考网站:http://sxp.sourceforge.net/

  q是一个把对象序列化ؓXML的轻量的C++库?/p>

  5.10 字符?/p>

  (1) C++ Str Library

  参考网站:http://www.utilitycode.com/str/

  操作字符串和字符的库Q支持Windows和支持gcc的多U^台。提供高度优化的
代码Qƈ且支持多U程环境和UnicodeQ同时还有正则表辑ּ的支持?/p>

  (2) Common Text Transformation Library

  参考网站:http://cttl.sourceforge.net/

  q是一个解析和修改STL字符串的库。CTTL substringcd以用来比较,插入Q?br>替换以及用EBNF的语法进行解析?/p>

  (3) GRETA

  参考网站:http://research.microsoft.com/projects/greta/

  q是由微软研I的研Ih员开发的处理正则表达式的库。在型匚w的情?br>下有非常优秀的表现?/p>

  5.11 l合

  (1) P::Classes

  参考网站:http://pclasses.com/

  一个高度可UL的C++应用E序框架。当前关注类型和U程安全的signal/slot
机制Qi/opȝ包括Z插g的网l协议透明的i/o架构Q基于插件的应用E序消息
日志框架Q访问sql数据库的cȝ{?/p>

  (2) ACDK - Artefaktur Component Development Kit

  参考网站:http://acdk.sourceforge.net/

  q是一个^台无关的C++lg框架Q类gJava或?NET中的框架Q反机Ӟ
U程QUnicodeQ废料收集,I/OQ网l,实用工具QXMLQ等{)Q以及对Java, P
erl, Python, TCL, Lisp, COM ?CORBA的集成?/p>

  (3) dlib C++ library

  参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/

  各种各样的类的一个综合。大整数QSocketQ线E,GUIQ容器类,以及览?br>录的API{等?/p>

  (4) Chilkat C++ Libraries

  参考网站:http://www.chilkatsoft.com/cpp_libraries.asp

  q是提供zipQe-mailQ编码,S/MIMEQXML{方面的库?/p>

  (5) C++ Portable Types Library (PTypes)

  参考网站:http://www.melikyan.com/ptypes/

  q是STL的比较简单的替代品,以及可移植的多线E和|络库?/p>

  (6) LFC

  参考网站:http://lfc.sourceforge.net/

  哦,q又是一个尝试提供一切的C++?/p>

  5.12 其他?/p>

  (1) Loki

  参考网站:http://www.moderncppdesign.com/

  哦,你可能抱怨我早该和Boost一起介l它Q一个实验性质的库。作者在loki?br>把C++模板的功能发挥到了极致。ƈ且尝试把cM设计模式q样思想层面的东襉K过
库来提供。同时还提供了智能指针这h较实用的功能?/p>

  (2) ATL

  ATL(Active Template Library)

  是一l小巧、高效、灵zȝc,q些cMؓ创徏可互操作的COMlg提供了基本的
设施?/p>

  (3) FC++: The Functional C++ Library

  q个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代?br>作。如果想要在OOP之外L另一分的乐趣Q可以去看看函数式程序设计的世界。大
师Peter Norvig?“Teach Yourself Programming in Ten Years”一文中将?br>数式语言列ؓ臛_应当学习?cȝE语a之一?/p>

  (4) FACT!

  参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html

  另外一个实现函数式语言Ҏ的?/p>

  (5) Crypto++

  提供处理密码Q消息验证,单向hashQ公匙加密系l等功能的免费库?/p>

  q有很多非常Ȁ动h心或者是极其实用的C++库,限于我们的水q以及文章的?br>q不能包括进来。在对于q些已经包含q来的库的介l中Q由于ƈ不是每一个我?br>都用过Q所以难免有偏颇之处Q请读者见谅?/p>

------------------------------------------------------------------------
--------

  6Q书c?/p>

  以前熊节先生曾撰文评论相对于JavaE序设计语言QC++的好书多如牛毛。荣耀
先生在《程序员》杂志上撰文《C++E序设计之四书五l》也本领域内几乎所有的
l典书籍作了全面的介l?M关于书的评论此时看来便是很多余的了。个人浅见,
除非你打以C++作ؓ唯一兴趣或者生存之本,一般读者确实没有够的旉和必?br>?0余本书籍全部阅读。更有参考h值的是荣耀先生的另一文章:《至应该阅
ȝ九本C++著作》,可以从下面的地址览到此文:

  http://www.royaloo.com/articles/articles_2003/9CppBooks.htm

  下面几本书对于走在C++初学之\上的读者是我们最愿意推荐l大家的Q?/p>

  (1) 《C++ Primer?/p>

  哦,也许你会抱怨我们ؓ什么不先介lTCPL,但对于走在学习之路上的入门者,
本书内容更ؓ全面Q更l易懂,我们U它?#8220;C++的超U宝?#8221;q不q分。配?br>一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路?/p>

  (2) 《Essential C++?/p>

  如果说《C++ Primer》是C++领域的超U宝典,那么此书作ؓ掌握C++的大局?br>当之无愧。正如?NET大局观》一书能够让读者全?NETQ本书讲qCC++中最核心
的全部主题。书虽不厚,内容_Q不׃ؓ《C++ Primer》读者茶余饭后的主题?br>之作?/p>

  (3) 《The C++ Programming Language?/p>

  BjarneZ带来的C++教程Q真正能够告诉你怎么用才叫真正的C++的唯一一?br>书。虽然如?#8220;某某E序设计语言”q样的书c会l大家一个内容全揽,入门到精
通的感觉Q但本书实不太适合初学者阅诅R如果你自认为是一名很有经验的C++E?br>序员Q那臛_也要反复咀嚼Bjarne先生所的若q内宏V?/p>

  (4) 《Effective C++》,《More Effective C++?/p>

  是的Q正如一些C++爱好者经总读过与没有读q上qC本作品来区分你是否是
C++高手。我们也极力推崇q两本著作。在各种介绍C++专家l验的书c里面,q两
本是最贴近语言本质Q看后最能够有脱胎换骨感觉的书,L书你需每日三省汝n
?/p>

  技术书c仁者见仁,q多的评论反无太多意义,p者喜好选择最适合自己?br>书方Z{?/p>

------------------------------------------------------------------------
--------

  7Q资源网?/p>

  正如我们可以通过计算机历史上的重要h物了解计机史的发展QC++相关人物
的网站也可以使我们得到最有h值的参考与借鉴Q下面的人物我们认ؓ没有介绍?br>必要Q只因下面的人物在C++领域的地位众所周知Q我们只相关的资源q行|列?br>供读者学习,他们有的工作于贝实验室Q有的工作于知名~译器厂商,有的在不
断推q语a的标准化Q有的ؓ读者撰写了多部千古奇作……
  (1) Bjarne Stroustrup
  http://www.research.att.com/~bs/

  (2) Stanley B. Lippman
  http://blogs.msdn.com/slippman/
  中文?http://www.zengyihome.net/slippman/index.htm

  (3) Scott Meyers
  http://www.aristeia.com/

  (4) David Musser
  http://www.cs.rpi.edu/~musser/

  (5) Bruce Eckel
  http://www.bruceeckel.com

  (6) Nicolai M. Josuttis
  http://www.josuttis.com/

  (7) Herb Sutter
  http://www.gotw.ca/

  (8) Andrei Alexandrescu
  http://www.coderncppdesign.com/

  (9) 侯捷先生
  http://www.jjhou.com

  (10) 孟岩先生
  先生J忙于工作,痴迷于技术,暂无个h主页Q关于先生的作品可以通过CSDN
的专栏和侯先生的主页讉K到?/p>

  (11) 荣耀先生
  http://www.royaloo.com/

  (12) 潘爱民先?br>  http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm

  除了上述大师的主外Q以下的l合cC++学习参考站Ҏ我们非常愿意向大?br>推荐的:

  (1) CodeProject
  http://www.codeproject.com

  (2) CodeGuru
  http://www.codeguru.com

  (3) Dr. Dobb's Journal
  http://www.ddj.com

  (4) C/C++ Users Journal
  http://www.cuj.com

  (5) Cl视?br>  http://www.c-view.org

  (6) allaboutprogram
  http://www.allaboutprogram.com
  其他资料

  (1) ISO IEC JTC1/SC22/WG21 - C++Q标准C++的权威参?br>  http://anubis.dkuug.dk/jtc1/sc22/wg21/

  (2) C++ FAQ LITE ?Frequently Asked Questions: 最为全面的C++FAQ
  http://www.sunistudio.com/cppfaq/index.html
  C/C++ 新闻l:
  你不妨尝试从q里提问和回{问题,很多不错的Q&A资源......

  (1) .alt.comp.lang.learn.c-c++
  q个单些Q如果你和我一h个菜?/p>

  (2) .comp.lang.c++.moderated
    嗯,q个昄水^高一?/p>

  (3) .comp.std.c++
  如果你需要讨论标准C++相关话题的话

------------------------------------------------------------------------
--------

  8Q不得不写的l束?/p>

  l束的时候也是ȝ现状Q展望未来的时候。虽然C++从脱胎于C开始,一路艰
隑֝L走过来,但是无论如何C++已经取得了工业基的地位。文章列丄大量相关
资源是最好的证明Q而业界的大量用C++写成的品代码以及大量的C++职业工程
师则是最直接的证明。同Ӟ我们可以看到各个高校的计机专业都开设有C++q门
评Q网l上对于C++的学习讨Z从来都没有停q。但是,在Java?NET两大企业
开发^台的围攻下,lh的感觉是C++来?#8220;不行”了?/p>

  C++在面向企业的软g开发中Q在开发便h等斚w的确要比Java和C#差很多,
其中一个问题是C++语言本n比较复杂Q学习曲U比较陡峭,另外一个问题是C++?br>准化的时间太长,丧失了很多的壮大ZQ耗费了很多精力在厂商的之间的斗争?br>Q而C++的标准库M个完善的E序开发框架还~少太多太多的内容,各个W三方的
cd和框架又在一致性和完整性上没法和随q_提供的框架相提ƈ论。难道C++真的
要退出历史舞CQ?/p>

  从C++目前的活跃程度,以及应用现状来说是完全能够肯定C++仍然是Y件工?br>的基Q也不会退出历史舞台的。另外从BoostQLokiq些库中我们也能够看到C++
的发展非常活跃,对于新技术新思维非常Ȁq,C++仍然q泛受到x。从ACE在高
性能通信领域的应用,以及MTLq样的库在数D领域的表现Q我们可以看?br>C++在高性能应用场合下的不可替代的作用,而嵌入式pȝq样的内存受限开发^?br>Q比如Symbian OS上,C++已经发挥着q且发挥更大的作用。可以预见的是以后的
软g无论上层的应用怎么变,它的底层核心都会是由C/C++q样的系l软g~写?br>Q比如Java虚拟机,.NET Framwork。因为只有这LpȝUY件才能完全彻底的?br>挥机器的功能?/p>

  需要看到的是两个趋势,一个趋势是C++变得更加复杂Q更加学院派Q通过模板
{有潜力的语法因素构造越来越_y的库成ؓ了现代C++的热点,虽然在利用库实现
新的~程范式Q乃臌计模式等斚w很有开创意义,也确实生了一些能够便捷开
发的工具Q但是更多的是把C++变得更加强大Q更加复杂,也更加难懂,g也更?br>学院z,不得不说它正在向边缘化道路发展。另一个趋势是C++在主的企业应用开
发中已经逐渐退ZQERPq样的企业Y件开发中基本上不会考虑C++Q除非需要?br>虑性能或者和遗留代码的集成这些因素。C++退守到pȝU别语言Q成Y件工业的
基础是大势所。然而反思一下,真的是退守么Q自从STL出现Q无数的人风起云?br>的开始支持C++,他们狂呼“我看到深夜消׃Q目标Y件工E的出现。我看到了可
l护的代码?#8221;是的QSTL在可l护性下做得如此。但是又怎样呢?STL为C++?br>q了C软g工程的道路,而在上层应用E序软g开发领域这块场地早不单独属?br>C++,很多E序设计语言都做得很Q疯狂的支持者会毫不犹U地说我们应当支持
C++,因ؓ它是世界上最的语言。而坦率地_你的腰杆真的那么么Q也许只?br>在逃避一些事实。C++是优U的,q不可否认,STL的出现让C++一度走上了最辉煌?br>时刻Q然而现在看?#8230;…我的一位恩师曾aQ真正能够将STL应用得淋漓尽致的人很
保守地说国内也不过200人,或许不加入STL能够使C++向着它应当发展的方向发展
的更好,而现在看来,C++也应当回首到真正属于他的那一片圣C……



cloud 2007-05-25 16:39 发表评论
]]>
断言的用环?/title><link>http://www.shnenglu.com/cloud/archive/2007/03/13/19694.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Tue, 13 Mar 2007 02:16:00 GMT</pubDate><guid>http://www.shnenglu.com/cloud/archive/2007/03/13/19694.html</guid><wfw:comment>http://www.shnenglu.com/cloud/comments/19694.html</wfw:comment><comments>http://www.shnenglu.com/cloud/archive/2007/03/13/19694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/cloud/comments/commentRss/19694.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cloud/services/trackbacks/19694.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入参数或输出参数的取值处于预期的范围?/span> <span lang="EN-US">.</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子程序开?/span> <span lang="EN-US">(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者结?/span> <span lang="EN-US">)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行?/span> <span lang="EN-US">, </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文g或流是处于打开</span> <span lang="EN-US">(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者关?/span> <span lang="EN-US">)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的状?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子程序开?/span> <span lang="EN-US">(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者结?/span> <span lang="EN-US">)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行?/span> <span lang="EN-US">, </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文g或流的读写未知处于开?/span> <span lang="EN-US">(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或结?/span> <span lang="EN-US">)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">4.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文g或流已用只度</span> <span lang="EN-US">, </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只写或可d写方式打开</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">5.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">仅用于输入的变量的值没有被子程序所修改</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">6.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针非空</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">7.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">传入子程序的数组或其他容器至能容纳</span> <span lang="EN-US">X</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个数据元?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">8.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表已初始?/span> <span lang="EN-US">,</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存储着真实的数?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">9.<span style="FONT: 7pt 'Times New Roman'">       </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子程序开?/span> <span lang="EN-US">(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或结?/span> <span lang="EN-US">)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行?/span> <span lang="EN-US">,</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">某个容器是空?/span> <span lang="EN-US">(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者满?/span> <span lang="EN-US">)</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">10.<span style="FONT: 7pt 'Times New Roman'">   </span></span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个经q高度优化的复杂子程序的q算l果和相对缓慢但代码清晰的子E序的预结果相一?br /><br />以上q些只是一些基本假?可以有更多的端来来说明的假定</span> </p> <img src ="http://www.shnenglu.com/cloud/aggbug/19694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cloud/" target="_blank">cloud</a> 2007-03-13 10:16 <a href="http://www.shnenglu.com/cloud/archive/2007/03/13/19694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对用虚拟函数的一Ҏ?/title><link>http://www.shnenglu.com/cloud/archive/2007/03/05/19214.html</link><dc:creator>cloud</dc:creator><author>cloud</author><pubDate>Mon, 05 Mar 2007 01:24:00 GMT</pubDate><guid>http://www.shnenglu.com/cloud/archive/2007/03/05/19214.html</guid><wfw:comment>http://www.shnenglu.com/cloud/comments/19214.html</wfw:comment><comments>http://www.shnenglu.com/cloud/archive/2007/03/05/19214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/cloud/comments/commentRss/19214.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cloud/services/trackbacks/19214.html</trackback:ping><description><![CDATA[      虚拟函数声明ؓ非公用的,共用函数声明ؓ非虚拟的.如果基类是需要被l承?则其虚拟函数一定要是虚拟的.<br />      q个观点和Template Method模式可以说是D途同?<br />      如果一个基cȝ虚拟函数被声明ؓprivate,?font face="Tahoma">可以认ؓzcd以覆盖该虚拟函数Q也可以不覆盖。但是不可以调用该函数的实现.<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Base<br /><img id="Codehighlighter1_11_79_Open_Image" onclick="this.style.display='none'; Codehighlighter1_11_79_Open_Text.style.display='none'; Codehighlighter1_11_79_Closed_Image.style.display='inline'; Codehighlighter1_11_79_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_11_79_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_79_Closed_Text.style.display='none'; Codehighlighter1_11_79_Open_Image.style.display='inline'; Codehighlighter1_11_79_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_11_79_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_11_79_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img id="Codehighlighter1_33_43_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_43_Open_Text.style.display='none'; Codehighlighter1_33_43_Closed_Image.style.display='inline'; Codehighlighter1_33_43_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_33_43_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_43_Closed_Text.style.display='none'; Codehighlighter1_33_43_Open_Image.style.display='inline'; Codehighlighter1_33_43_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f()</span><span id="Codehighlighter1_33_43_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_33_43_Open_Text"><span style="COLOR: #000000">{ do_f(); }</span></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> do_f();<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></div><br />      如果一个基cȝ虚拟函数被声明ؓprotected,则可以认为派生类需要覆盖该虚拟函数,而且得调用基cȝ虚拟函数的实?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Base<br /><img id="Codehighlighter1_11_81_Open_Image" onclick="this.style.display='none'; Codehighlighter1_11_81_Open_Text.style.display='none'; Codehighlighter1_11_81_Closed_Image.style.display='inline'; Codehighlighter1_11_81_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_11_81_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_81_Closed_Text.style.display='none'; Codehighlighter1_11_81_Open_Image.style.display='inline'; Codehighlighter1_11_81_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_11_81_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_11_81_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img id="Codehighlighter1_33_43_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_43_Open_Text.style.display='none'; Codehighlighter1_33_43_Closed_Image.style.display='inline'; Codehighlighter1_33_43_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_33_43_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_43_Closed_Text.style.display='none'; Codehighlighter1_33_43_Open_Image.style.display='inline'; Codehighlighter1_33_43_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f()</span><span id="Codehighlighter1_33_43_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_33_43_Open_Text"><span style="COLOR: #000000">{ do_f(); }</span></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> do_f();<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Derive : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Base<br /><img id="Codehighlighter1_112_231_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_231_Open_Text.style.display='none'; Codehighlighter1_112_231_Closed_Image.style.display='inline'; Codehighlighter1_112_231_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_112_231_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_231_Closed_Text.style.display='none'; Codehighlighter1_112_231_Open_Image.style.display='inline'; Codehighlighter1_112_231_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_112_231_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_112_231_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> do_f()<br /><img id="Codehighlighter1_153_229_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_229_Open_Text.style.display='none'; Codehighlighter1_153_229_Closed_Image.style.display='inline'; Codehighlighter1_153_229_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_153_229_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_153_229_Closed_Text.style.display='none'; Codehighlighter1_153_229_Open_Image.style.display='inline'; Codehighlighter1_153_229_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_153_229_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_153_229_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> do something</span><span style="COLOR: #008000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Base::do_f();<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> do something</span><span style="COLOR: #008000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></div></font><img src ="http://www.shnenglu.com/cloud/aggbug/19214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cloud/" target="_blank">cloud</a> 2007-03-05 09:24 <a href="http://www.shnenglu.com/cloud/archive/2007/03/05/19214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.hmnykj.cn" target="_blank">aaþ</a>| <a href="http://www.wuxicld.cn" target="_blank">ҹƷþ2021</a>| <a href="http://www.zl6688.com.cn" target="_blank">ܻƺ۵վþmimiɫ</a>| <a href="http://www.xueyang.net.cn" target="_blank">þõӰ2021</a>| <a href="http://www.dtvpartner.com.cn" target="_blank">þþþþùƷŮ</a>| <a href="http://www.huizegufen.cn" target="_blank">þwww˳_Ƭ</a>| <a href="http://www.k2938.cn" target="_blank">ŷ˾þþƷ</a>| <a href="http://www.dw172.cn" target="_blank">ƷŮþþþ</a>| <a href="http://www.024qixinyu.cn" target="_blank">þ99Ʒþþþþˮ</a>| <a href="http://www.k2938.cn" target="_blank">þֻǾƷ66</a>| <a href="http://www.pqdaili.cn" target="_blank">Ʒһþ㽶߿</a>| <a href="http://www.zhidaow.com.cn" target="_blank">þþþùƷ鶹ARӰԺ</a>| <a href="http://www.safenote.cn" target="_blank">޹þþþƷС˵</a>| <a href="http://www.ciidc.org.cn" target="_blank">þݹֻƬ</a>| <a href="http://www.joy7.com.cn" target="_blank">þëƬѿһ</a>| <a href="http://www.printinginfo.com.cn" target="_blank">רþۺϾĻ</a>| <a href="http://www.fuxingjidian.cn" target="_blank">91þþƷӰ</a>| <a href="http://www.uutools.cn" target="_blank">91Ʒþþþþio</a>| <a href="http://www.yicheng688.cn" target="_blank">þþþþþþ</a>| <a href="http://www.33k4.cn" target="_blank">91þó</a>| <a href="http://www.6998bar.cn" target="_blank">99þþþƷ</a>| <a href="http://www.linux123.cn" target="_blank">ղƷ99þþþþ</a>| <a href="http://www.dongfangmoney.cn" target="_blank">ٸƷþ</a>| <a href="http://www.hpd4.cn" target="_blank">ھƷþþþþ鶹</a>| <a href="http://www.bestlevering.cn" target="_blank">þúݺݸ߳޾Ʒ</a>| <a href="http://www.0769zc.net.cn" target="_blank">18պҹþó</a>| <a href="http://www.diylady.cn" target="_blank">þѴƬ</a>| <a href="http://www.dfux.com.cn" target="_blank">þù</a>| <a href="http://www.p8595.cn" target="_blank">þۺϾɫۺŷȥ</a>| <a href="http://www.78cbg.cn" target="_blank">ƷþþþþĻ</a>| <a href="http://www.hfdsbw.cn" target="_blank">þþƷоƷ</a>| <a href="http://www.fm935.cn" target="_blank">99þѹƷ</a>| <a href="http://www.haosenmy.cn" target="_blank">޾ƷŮþþ</a>| <a href="http://www.pingyaonews.cn" target="_blank">þٸ۲AVר</a>| <a href="http://www.fyhd.net.cn" target="_blank">ɫþþþþþС˵</a>| <a href="http://www.cynh.net.cn" target="_blank">þþþùƷ۲ӰԺ</a>| <a href="http://www.0553fc.cn" target="_blank">þAV߳AVAV</a>| <a href="http://www.g549.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.yhlj.net.cn" target="_blank">þ99þ99Ʒӿ</a>| <a href="http://www.glkk.net.cn" target="_blank">ɫۺϾþĻ</a>| <a href="http://www.huodiba.cn" target="_blank">99þù¶Ʒ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>