?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 如何写一个c++插g化系l?南软g开发|׃软g开?南赢dU技软g开发公?/title> <meta name="keywords" content="如何写一个c++插g化系l?/> <meta name="description" content="1.Z么需要插件化pȝ“编E就是构Z个一个自q积木,然后用自q积木搭建大pȝ”?nbsp;但是E序q是会比U木要复杂,我们的系l必要保证积木能搭徏出大的系l(必须能被l合Q,有必能使各个积木之间的?/> <link href="/css/style.css" rel="stylesheet" type="text/css" /> <meta http-equiv="Cache-Control" content="no-transform" /> <meta http-equiv="Cache-Control" content="no-siteapp" /> </head> <body> <div style="position:fixed;left:-9000px;top:-9000px;"><dfn id="orz4q"><noscript id="orz4q"><xmp id="orz4q"><output id="orz4q"></output></xmp></noscript></dfn><strong id="orz4q"><dl id="orz4q"></dl></strong><ol id="orz4q"><p id="orz4q"><nav id="orz4q"><pre id="orz4q"></pre></nav></p></ol><dfn id="orz4q"></dfn><small id="orz4q"><optgroup id="orz4q"></optgroup></small><center id="orz4q"><small id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></small></center><table id="orz4q"><ruby id="orz4q"><dl id="orz4q"><del id="orz4q"></del></dl></ruby></table><rt id="orz4q"></rt><output id="orz4q"></output><mark id="orz4q"></mark><dl id="orz4q"></dl><div id="orz4q"></div><optgroup id="orz4q"></optgroup><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><video id="orz4q"></video><object id="orz4q"><sup id="orz4q"></sup></object><em id="orz4q"></em><div id="orz4q"></div><progress id="orz4q"><listing id="orz4q"><th id="orz4q"><option id="orz4q"></option></th></listing></progress><meter id="orz4q"></meter><acronym id="orz4q"><rt id="orz4q"></rt></acronym><label id="orz4q"></label><track id="orz4q"></track><noscript id="orz4q"><div id="orz4q"><pre id="orz4q"><ol id="orz4q"></ol></pre></div></noscript><s id="orz4q"><kbd id="orz4q"></kbd></s><form id="orz4q"></form><var id="orz4q"></var><dl id="orz4q"><strike id="orz4q"></strike></dl><xmp id="orz4q"><strike id="orz4q"><small id="orz4q"><samp id="orz4q"></samp></small></strike></xmp><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><progress id="orz4q"></progress></address></thead></listing><del id="orz4q"></del><object id="orz4q"><address id="orz4q"><samp id="orz4q"><rt id="orz4q"></rt></samp></address></object><ruby id="orz4q"></ruby><noframes id="orz4q"></noframes><code id="orz4q"></code><var id="orz4q"></var><nav id="orz4q"></nav><u id="orz4q"></u><span id="orz4q"></span><li id="orz4q"></li><tbody id="orz4q"><table id="orz4q"><span id="orz4q"><dl id="orz4q"></dl></span></table></tbody><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><var id="orz4q"></var><nav id="orz4q"></nav><rt id="orz4q"></rt><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><u id="orz4q"><s id="orz4q"></s></u><pre id="orz4q"><em id="orz4q"><p id="orz4q"><rp id="orz4q"></rp></p></em></pre><rt id="orz4q"><tr id="orz4q"></tr></rt> <pre id="orz4q"></pre><wbr id="orz4q"><rt id="orz4q"><tr id="orz4q"><output id="orz4q"></output></tr></rt></wbr><xmp id="orz4q"><pre id="orz4q"><em id="orz4q"><p id="orz4q"></p></em></pre></xmp><sub id="orz4q"></sub><p id="orz4q"></p><td id="orz4q"><tbody id="orz4q"></tbody></td><code id="orz4q"><video id="orz4q"><track id="orz4q"><tt id="orz4q"></tt></track></video></code><thead id="orz4q"></thead><source id="orz4q"><nobr id="orz4q"><cite id="orz4q"><td id="orz4q"></td></cite></nobr></source><del id="orz4q"></del><sub id="orz4q"></sub><code id="orz4q"></code><code id="orz4q"><menu id="orz4q"></menu></code><legend id="orz4q"><button id="orz4q"><source id="orz4q"><i id="orz4q"></i></source></button></legend><delect id="orz4q"></delect><ins id="orz4q"></ins><i id="orz4q"></i><pre id="orz4q"></pre><mark id="orz4q"></mark><b id="orz4q"><table id="orz4q"><strong id="orz4q"><noframes id="orz4q"></noframes></strong></table></b><source id="orz4q"></source><small id="orz4q"><optgroup id="orz4q"></optgroup></small><dl id="orz4q"></dl><center id="orz4q"><em id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></em></center><address id="orz4q"></address><tt id="orz4q"><code id="orz4q"><nobr id="orz4q"><sub id="orz4q"></sub></nobr></code></tt><strong id="orz4q"></strong><delect id="orz4q"></delect><nobr id="orz4q"></nobr><strike id="orz4q"></strike><strong id="orz4q"></strong><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><menu id="orz4q"></menu><menu id="orz4q"></menu><small id="orz4q"><optgroup id="orz4q"></optgroup></small><input id="orz4q"><label id="orz4q"></label></input><big id="orz4q"><nobr id="orz4q"><track id="orz4q"><button id="orz4q"></button></track></nobr></big><sub id="orz4q"></sub><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><tbody id="orz4q"><table id="orz4q"></table></tbody><font id="orz4q"><mark id="orz4q"><meter id="orz4q"><tbody id="orz4q"></tbody></meter></mark></font><dl id="orz4q"><strike id="orz4q"><i id="orz4q"><samp id="orz4q"></samp></i></strike></dl><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><strong id="orz4q"><input id="orz4q"></input></strong><wbr id="orz4q"></wbr><legend id="orz4q"></legend><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><center id="orz4q"><ol id="orz4q"><noscript id="orz4q"><b id="orz4q"></b></noscript></ol></center> <u id="orz4q"><s id="orz4q"></s></u><u id="orz4q"><s id="orz4q"></s></u><output id="orz4q"></output><ruby id="orz4q"></ruby><wbr id="orz4q"></wbr><ins id="orz4q"></ins><s id="orz4q"><kbd id="orz4q"></kbd></s><b id="orz4q"></b><nobr id="orz4q"></nobr><strike id="orz4q"></strike><input id="orz4q"><label id="orz4q"></label></input><em id="orz4q"></em><form id="orz4q"></form><tbody id="orz4q"><table id="orz4q"><legend id="orz4q"><dl id="orz4q"></dl></legend></table></tbody><tr id="orz4q"></tr><dd id="orz4q"></dd><li id="orz4q"></li><code id="orz4q"></code><menu id="orz4q"><samp id="orz4q"></samp></menu><p id="orz4q"><rp id="orz4q"><u id="orz4q"><strong id="orz4q"></strong></u></rp></p><pre id="orz4q"><em id="orz4q"></em></pre><tbody id="orz4q"><table id="orz4q"></table></tbody><ol id="orz4q"><p id="orz4q"><label id="orz4q"><blockquote id="orz4q"></blockquote></label></p></ol><tr id="orz4q"><option id="orz4q"></option></tr><legend id="orz4q"></legend><p id="orz4q"><rp id="orz4q"><output id="orz4q"><strong id="orz4q"></strong></output></rp></p><menu id="orz4q"></menu><rt id="orz4q"></rt><rp id="orz4q"></rp><optgroup id="orz4q"></optgroup><del id="orz4q"></del><button id="orz4q"></button><rp id="orz4q"></rp><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><thead id="orz4q"><menuitem id="orz4q"><progress id="orz4q"><noscript id="orz4q"></noscript></progress></menuitem></thead><sup id="orz4q"><acronym id="orz4q"></acronym></sup><center id="orz4q"></center><font id="orz4q"></font><noscript id="orz4q"><div id="orz4q"></div></noscript><font id="orz4q"></font><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><meter id="orz4q"></meter><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><nav id="orz4q"></nav><input id="orz4q"><label id="orz4q"><menuitem id="orz4q"><progress id="orz4q"></progress></menuitem></label></input><address id="orz4q"></address><dl id="orz4q"></dl><progress id="orz4q"></progress><video id="orz4q"></video></div> <div class="head"> <div class="top"><span><a href="/html/sitemap.xml">XML</a> | <a href="/html/sitemap.html">HTML</a> | <a href="/sitemap.txt">TXT</a></span></div> <div class="bank"> <div class="logo"> <h1><strong><a href="http://www.themmauniversity.com" style="margin-right:10px">南软g开?/a></strong><strong><a href="http://www.themmauniversity.com">׃软g开?/a></strong></h1> </div> <div class="contact-top"></div> </div> <div class="menu"> <ul> <li><a href="/">?#160;   ?/a></li> <li><a href="/About/">关于我们</a></li> <li><a href="/Advantage/">开发优?/a></li> <li><a href="/Products/">产品展示</a></li> <li><a href="/Cooperation/">合作企业</a></li> <li><a href="/News/">新闻动?/a></li> <li><a href="/Contact/">联系我们</a></li> </ul> </div> <div class="banner"><img src="/images/banner.jpg" width="1000" height="341"/></div> </div> <div id="position"><div>您当前位|:<a href="/">软g开?/a> >> <a href="/News/">新闻动?/a> >> <a href="/News/Technology/">软g开发技?/a> >> 览文章</div></div> <div class="youshi_f1" id="youshi_tdyx"> <div class="youshi01"> <h1 class="article_title">如何写一个c++插g化系l?/h1> <div class="article_author">d旉Q?016-12-20 17:11:49 文章作者:<a href="/">南软g开?/a> 览ơ数Q?Script Language="Javascript" Src="/item/GetHits.asp?Action=Count&GetFlag=0&m=1&ID=3065"></Script></div> <div class="article_main"><div id="MyContent"><p style="margin-top: 0px; margin-bottom: 0px; padding: 15px 0px 0px; line-height: 30px; font-family: 宋体; color: rgb(51, 51, 51); font-size: 13.3333px; white-space: normal; background-color: rgb(241, 241, 241);"><strong style="margin: 0px; padding: 0px;">1.Z么需要插件化pȝ</strong></p><p>  “编E就是构Z个一个自q积木, 然后用自q积木搭建大pȝ”?/p><p> </p><p>  但是E序q是会比U木要复杂, 我们的系l必要保证积木能搭徏出大的系l(必须能被l合Q,有必能使各个积木之间的耦合降低到最?/p><p> </p><p>  传统的程序结构中也是有模块的划分Q但是主要有如下几个~点Q?/p><p> </p><p>    a: c++二进制兼?/p><p> </p><p>    b: 模块对外暴露的东西过多,使调用者要兛_的东西过?/p><p> </p><p>    c: 装的模块只是作为功能的实现者封装,而不是接口的提供?/p><p> </p><p>    d: 可替换性和可扩展性差</p><p> </p><p>  而插件式的系l架构就是ؓ了解册L问题。插件化设计的优点?插g化设计就是ؓ了解册些问题的Q所以以上的~点是q优点</p><p> </p><p><strong style="margin: 0px; padding: 0px;">2.插g话系l的原理</strong></p><p>  指导性原则:“面向接口编E而不是实现编E?/p><p>  其接口的定义为interface, 其实转换一下的意思是面向U虚cȝE,当然也可以包装成面向服务和组件编E?/p><p>  如我可以q样定义一个接?interface)</p><p> </p><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>interfacecptf IRole{</p><p>  virtual cptf ::ulong getHealth() = 0;</p><p>  virtual cptf ::ulong getHurt() = 0;</p><p>  virtual wstring getName() = 0;</p><p>};</p><p>  插g的目标就是实现IRoleQ?业务层的目标是调用IRoleQ?业务层不知道IRole具体是如何实现的Q而实现者也不用兛_业务层是如何调用的?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">3.插g化系l的目标</strong></p><p>  1). 使用者能通过规范Q开发自q插gQ实用已有的插gQ插件又能控制对外暴露的内容?/p><p>  2). q行时候能动态安装、启动、停在、卸?/p><p>  3). 每一个插件提供一个或多个服务Q其他插件是Ҏ接口来获取服务提供?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">4. 一个插件化pȝ应该是怎么构成?/strong></p><p>  OSGIQJava中媄响力最大的插g化系l就是OSGI标准</p><p>  OSGI的定义:The dynamic module system for java</p><p>  借鉴osgiҎ件系l的定义Q我认ؓ一个典型的插gpȝ应该有如下几个方面构?</p><p>  “基?微内?pȝ插g+应用插g?/p><p>  其中微内?负责如下功能Q?/p><p> </p><p>    1?负责插g的加载,,初始化?/p><p> </p><p>    2?负责服务的注册?/p><p> </p><p>    3?负责服务的调用?/p><p> </p><p>    4?服务的管理?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">5. 一个简单场景的随想</strong></p><p>  比如设计下如下的游戏场景Q一个RPG游戏Q?玩家控制一个英雄,在场景中有不同的怪物Q而且随着游戏的更斎ͼ</p><p>  英雄{的提升又会有不同的怪物出现Q?q里想把怪物设计为插件?/p><p>  首先工程是这L布局?/p><p> </p><p> </p><p> </p><p>首先要在做的是定义接口, q里我需要一个英雄的接口Q有需要一个怪物的接口?/p><p> </p><p>interfacecptf IHero : public cptf ::core:: IDispatch</p><p>                           , public IRole {</p><p>      virtual    cptf ::ulong attack() = 0;</p><p>};</p><p> </p><p>interfacecptf IOgre : public cptf ::core:: IDispatch</p><p>                           , public IRole {</p><p> </p><p>};</p><p>然后作ؓ插g我需要实C个HeroQ?和多个Ogre</p><p> </p><p> </p><p> </p><p> </p><p>class Hero : public ServiceCoClass<Hero ></p><p>                , public ObjectRoot <SingleThreadModel></p><p>                , public cptf ::core:: IDispatchImpl<IHero >{</p><p> </p><p>class Wolf : public ServiceCoClass<Wolf ></p><p>                           , public ObjectRoot<SingleThreadModel ></p><p>                           , public cptf::core ::IDispatchImpl< IOgre></p><p> </p><p>class Tiger : public ServiceCoClass<Tiger ></p><p>                           , public ObjectRoot<SingleThreadModel ></p><p>                           , public cptf::core ::IDispatchImpl< IOgre> </p><p>最后,在主工程用我要用到这些插?/p><p> </p><p>复制代码</p><p>void BattleMannager ::run()</p><p>{</p><p>      hero_ = static_cast<IHero *>(serviceContainer_. getService(Hero_CSID , IHero_IID));</p><p>      if (!hero_ )return;</p><p>      printHero(hero_ );</p><p> </p><p>      list<IService *> services = serviceContainer_ .getServices( IOgre_IID);</p><p>      list<IOgre *> ogres = CastUtils::parentsToChildren <IService, IOgre>(services );</p><p>      for_each(ogres .begin(), ogres.end (), bind(&BattleMannager ::printOgre, _1));</p><p> </p><p>      services = serviceContainer_ .getServices( IHumanOgre_IID);</p><p>      list<IHumanOgre *> hummanOgres = CastUtils::parentsToChildren <IService, IHumanOgre>(services );</p><p>      for_each(hummanOgres .begin(), hummanOgres.end (), bind(&BattleMannager ::printHumanOgre, _1));</p><p>}</p><p>复制代码</p><p>  以上Q?因ؓ逻辑层和插g实现层都已经好了Q?整个程也已l跑通,但是q是的疑问:服务是怎么加蝲的?</p><p> </p><p><strong style="margin: 0px; padding: 0px;">6. 如何q行插g的加载以及服务的注册</strong></p><p>    借鉴OSGIQ?我这里把pȝ设计为bundle+service的组合?bundle是service的容器,service是功能的具体实现者?/p><p> </p><p>  在windows下,bundle用dll来表C?/p><p> </p><p>    那bundle在windwos下加载就很简单了LoadLibrary Apip?  </p><p> </p><p>    但是再c++中dll的接口还必须要考虑的一个问题就是c++的二q制兼容性:现在没有标准?C++ ABI。这意味着Q不同编译器Q甚臛_一~译器的不同版本Q会~译Z同的目标文g和库。这个问题导致的最显而易见的问题是Q不同编译器会用不同的名称改写法。这样对插g的接口来说是致命的。当然我们可以用c api来作为接口,但是q样势必会对整体的设计生媄响,而且作ؓ一个装B的c++E序员,我们怎么能容忍要借用低语言的特性来实现我们的功能呢。当然幸亏还有另外一U方式,那就是虚表。当然不是所有的c++~译器对虚表的实C是不一L(好吧~~)Q但是至主?多主~~不能定)的编译器虚表都是在对象的W一个位|。好吧,现在军_用虚表来Ҏ件接口的实现了,所以我们就可以用这L方式来计具体实现类的地址?/p><p> </p><p>#define  CPTF_PACKING 8</p><p>#define cptf_offsetofclass (base, derived) \</p><p>     (( cptf::ulong )(static_cast< base*>((derived *)CPTF_PACKING))- CPTF_PACKING)</p><p>   哇,好神奇的代码Q?q个是ؓ什么呢?q个需要对c++内存对象模型需要深入得了解了,可能需要拜?lt;c++内存对象模型>Q这里篇q有限这里就不解释了。但是如果有看官惌问“你Z么这么天才能惛_q样的写法?”,虽然我很惌我很天才Q但是其实正是情冉|我参考的atl中的源码Q而且整个插g加蝲q程我都是山寨了atl中的相关代码的?nbsp;</p><p> </p><p>    但是q是有一个问题, 在GameMain中,认识的是IHeroQ?Ҏ不知道有个Hero的实玎ͼ所有可能有q样的代码IHero* hero = New Hero() q样动作?/p><p>那我们要如何q行q样的new动作?当然我们说Hero是在Role dll中的Q?在dll被加载的时候可以new HeroQ?然后把hero对象的地址攑ֈ某个堆中Q标志让GameMain使用。作Z个{换的伪设计h员, 我也是认样会有性能问题的, 我不仅要做到加蝲Q?q要做到懒加载?/p><p>    那如何做到懒加蝲呢?</p><p>    感谢微YQ在vc++中有机制帮我们做刎ͼ在其他的~译器中也会有其他的实现Q但是这里我们只做了vc++中的实现?/p><p>    首先声明一个自qD,D名可以叫cptfQ?/p><p> </p><p>#pragma section ("CPTF$__a", read, shared )</p><p>#pragma section ("CPTF$__z", read, shared )</p><p>#pragma section ("CPTF$__m", read, shared )</p><p>  然后在编译的时候,把具体实现的cȝCreate函数地址攑ֈq个D中</p><p> </p><p>#define CPTF_OBJECT_ENTRY_AUTO (class) \</p><p>  __declspec(selectany ) AutoObjectEntry __objMap_##class = {class::clsid (), class:: creatorClass_::createInstance }; \</p><p>  extern "C" __declspec( allocate("CPTF$__m" )) __declspec(selectany ) AutoObjectEntry* const __pobjMap_ ##class = &__objMap_ ##class; \</p><p>  CPTF_OBJECT_ENTRY_PRAGMA(class )</p><p> 最后在加蝲的时候,变量q个D,如果csid命中Q则调用CreateҎ</p><p> </p><p>复制代码</p><p>inline bool cptfModuleGetClassObject( const CptfServiceEntities * cpfgModel</p><p>                                                     , const cptf::IID & csid</p><p>                                                     , const cptf::IID & iid</p><p>                                                     , void** rtnObj)</p><p>     {</p><p>            bool rtn (false);</p><p>            assert(cpfgModel );</p><p>            for (AutoObjectEntry ** entity = cpfgModel->autoObjMapFirst_</p><p>                ; entity != cpfgModel ->autoObjMapLast_; ++entity)</p><p>           {</p><p>                 AutoObjectEntry* obj = *entity;</p><p>                 if (obj == NULL) continue;</p><p>                 if (obj ->crateFunc != NULL && csid == obj-> iid){</p><p>                      rtn  = obj ->crateFunc( iid, rtnObj );</p><p>                      break;</p><p>                }</p><p>           }</p><p> </p><p>            return rtn ;</p><p>     }</p><p>复制代码</p><p>  ȝ下流E:</p><p>    1. GameMian使用的是IHero, </p><p>    2. Hero是IHero的实现者,在编译的规程中,把Create Hero的方法编译到固定D中</p><p>    3. GameMianq行new的时候其实调用的是Dll固定D中的函数地址</p><p>    4. 利用 上面的cptf_offsetofclass 宏实现对IHero?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">7. 服务的管?/strong></p><p>  每一个服务都需要一个id来标志它Q?q里qguidQ?命名为IID---interface id</p><p>  每一个服务的实现者也必须要有id来标志, q也是一个guidQ?命名为csid</p><p>  我们把服务和服务实现者的理信息用配|文件管理v来,services.xml, 对Hero的定?/p><p> </p><p>复制代码</p><p><service></p><p>          <bundle>Role.dll</bundle></p><p>          <csid>500851c0-7c2a-11e3-8c28-bc305bacf447</csid></p><p>          <description>hero</description></p><p>          <name>Hero</name></p><p>          <serviceId>99f9dd8f-7c1a-11e3-9f9d-bc305bacf447</serviceId></p><p>          <serviceName>IHero</serviceName></p><p> </service></p><p>复制代码</p><p>  当然一个插件的理器也是必ȝQ?理Service的注册,~存Q析构、获取,查询{。这里用ServiceContainer实现</p><p> </p><p><strong style="margin: 0px; padding: 0px;">8. Z插g的架?/strong></p><p>    Z插gpȝ的架构:</p><p> </p><p>     主要分三部分Q?1. 使用其对象模型的ȝl或d用程?/p><p>                         2. 插g理?/p><p>                         3. 插g</p><p>    所有的插g但是从IService, 是参考Com中IUnkown</p><p>interfacecptf IService{</p><p>            virtual    cptf ::ulong addRef() = 0;</p><p>            virtual cptf ::ulong release() = 0;</p><p>            virtual bool queryInterface( const cptf ::IID& iid, void**rntObj ) = 0;</p><p>     };</p><p>  其实插g的内核ƈ不复杂,复杂的是Ҏ件接口的定义和封装,如何Ҏ不同的业务场景抽象出不同的interface?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">9. 源代?/strong></p><p>   本文不是很水的理论,所有的理论都是l过代码验证的?nbsp;</p><p>     本文涉及到的代码在我的github上,https://github.com/sld666666/cptf</p><p>     工程的目标是建立一个跨q_的c++插g开发框Ӟ 现在的是一个能成功在vc++下运行demo的插件化framework</p><p>     用了boost和stlQ如果要深入了解core中的代码Q还需要对模板有了解, 水深请勿L试</p><p>     当然有的看官会对core中的代码非常熟悉Q那可能你发CQ?我是山寨atl实现?/p><p><strong style="margin: 0px; padding: 0px;">10. 今后改进的方?/strong></p><p>     1. service如何释放Q?q在考虑是用野指针还是智能指针还是垃圑֛收机?/p><p>     2. 错误处理</p><p>     3. 跨^台和跨编译器</p><p><br/></p></div> </div> </div> </div> <div class="clear"></div> <div class="foot"> <div class="foot_menu"> <ul> <li><a href="/About/">关于我们</a></li> <li><a href="/Advantage/">开发优?/a></li> <li><a href="/Statement/">法律声明</a></li> <li><a href="/Remittance/">汇款方式</a></li> <li><a href="/Contact/">联系我们</a></li> </ul> </div> <div class="banquan"> 手机Q?8678812288 EQMail:1069706080@qq.com<br /> 地址Q山东省南市舜耕\泉城公园东门园内向北50c? 鲁ICP?7011972? 版权所?008Q?013 ׃赢d信息U技有限公司<script type="text/javascript"> var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "#/h.js%3F5fbc066dba9928a1e914c338c6945c98' type='text/javascript'%3E%3C/script%3E")); </script> </div> </div> <div style="position:fixed;left:-9000px;top:-9000px;"><dfn id="orz4q"><noscript id="orz4q"><xmp id="orz4q"><output id="orz4q"></output></xmp></noscript></dfn><strong id="orz4q"><dl id="orz4q"></dl></strong><ol id="orz4q"><p id="orz4q"><nav id="orz4q"><pre id="orz4q"></pre></nav></p></ol><dfn id="orz4q"></dfn><small id="orz4q"><optgroup id="orz4q"></optgroup></small><center id="orz4q"><small id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></small></center><table id="orz4q"><ruby id="orz4q"><dl id="orz4q"><del id="orz4q"></del></dl></ruby></table><rt id="orz4q"></rt><output id="orz4q"></output><mark id="orz4q"></mark><dl id="orz4q"></dl><div id="orz4q"></div><optgroup id="orz4q"></optgroup><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><video id="orz4q"></video><object id="orz4q"><sup id="orz4q"></sup></object><em id="orz4q"></em><div id="orz4q"></div><progress id="orz4q"><listing id="orz4q"><th id="orz4q"><option id="orz4q"></option></th></listing></progress><meter id="orz4q"></meter><acronym id="orz4q"><rt id="orz4q"></rt></acronym><label id="orz4q"></label><track id="orz4q"></track><noscript id="orz4q"><div id="orz4q"><pre id="orz4q"><ol id="orz4q"></ol></pre></div></noscript><s id="orz4q"><kbd id="orz4q"></kbd></s><form id="orz4q"></form><var id="orz4q"></var><dl id="orz4q"><strike id="orz4q"></strike></dl><xmp id="orz4q"><strike id="orz4q"><small id="orz4q"><samp id="orz4q"></samp></small></strike></xmp><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><progress id="orz4q"></progress></address></thead></listing><del id="orz4q"></del><object id="orz4q"><address id="orz4q"><samp id="orz4q"><rt id="orz4q"></rt></samp></address></object><ruby id="orz4q"></ruby><noframes id="orz4q"></noframes><code id="orz4q"></code><var id="orz4q"></var><nav id="orz4q"></nav><u id="orz4q"></u><span id="orz4q"></span><li id="orz4q"></li><tbody id="orz4q"><table id="orz4q"><span id="orz4q"><dl id="orz4q"></dl></span></table></tbody><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><var id="orz4q"></var><nav id="orz4q"></nav><rt id="orz4q"></rt><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><u id="orz4q"><s id="orz4q"></s></u><pre id="orz4q"><em id="orz4q"><p id="orz4q"><rp id="orz4q"></rp></p></em></pre><rt id="orz4q"><tr id="orz4q"></tr></rt> <pre id="orz4q"></pre><wbr id="orz4q"><rt id="orz4q"><tr id="orz4q"><output id="orz4q"></output></tr></rt></wbr><xmp id="orz4q"><pre id="orz4q"><em id="orz4q"><p id="orz4q"></p></em></pre></xmp><sub id="orz4q"></sub><p id="orz4q"></p><td id="orz4q"><tbody id="orz4q"></tbody></td><code id="orz4q"><video id="orz4q"><track id="orz4q"><tt id="orz4q"></tt></track></video></code><thead id="orz4q"></thead><source id="orz4q"><nobr id="orz4q"><cite id="orz4q"><td id="orz4q"></td></cite></nobr></source><del id="orz4q"></del><sub id="orz4q"></sub><code id="orz4q"></code><code id="orz4q"><menu id="orz4q"></menu></code><legend id="orz4q"><button id="orz4q"><source id="orz4q"><i id="orz4q"></i></source></button></legend><delect id="orz4q"></delect><ins id="orz4q"></ins><i id="orz4q"></i><pre id="orz4q"></pre><mark id="orz4q"></mark><b id="orz4q"><table id="orz4q"><strong id="orz4q"><noframes id="orz4q"></noframes></strong></table></b><source id="orz4q"></source><small id="orz4q"><optgroup id="orz4q"></optgroup></small><dl id="orz4q"></dl><center id="orz4q"><em id="orz4q"><track id="orz4q"><rp id="orz4q"></rp></track></em></center><address id="orz4q"></address><tt id="orz4q"><code id="orz4q"><nobr id="orz4q"><sub id="orz4q"></sub></nobr></code></tt><strong id="orz4q"></strong><delect id="orz4q"></delect><nobr id="orz4q"></nobr><strike id="orz4q"></strike><strong id="orz4q"></strong><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><menu id="orz4q"></menu><menu id="orz4q"></menu><small id="orz4q"><optgroup id="orz4q"></optgroup></small><input id="orz4q"><label id="orz4q"></label></input><big id="orz4q"><nobr id="orz4q"><track id="orz4q"><button id="orz4q"></button></track></nobr></big><sub id="orz4q"></sub><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><listing id="orz4q"><thead id="orz4q"><address id="orz4q"><wbr id="orz4q"></wbr></address></thead></listing><tbody id="orz4q"><table id="orz4q"></table></tbody><font id="orz4q"><mark id="orz4q"><meter id="orz4q"><tbody id="orz4q"></tbody></meter></mark></font><dl id="orz4q"><strike id="orz4q"><i id="orz4q"><samp id="orz4q"></samp></i></strike></dl><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><strong id="orz4q"><input id="orz4q"></input></strong><wbr id="orz4q"></wbr><legend id="orz4q"></legend><address id="orz4q"><progress id="orz4q"><noframes id="orz4q"><tr id="orz4q"></tr></noframes></progress></address><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><center id="orz4q"><ol id="orz4q"><noscript id="orz4q"><b id="orz4q"></b></noscript></ol></center> <u id="orz4q"><s id="orz4q"></s></u><u id="orz4q"><s id="orz4q"></s></u><output id="orz4q"></output><ruby id="orz4q"></ruby><wbr id="orz4q"></wbr><ins id="orz4q"></ins><s id="orz4q"><kbd id="orz4q"></kbd></s><b id="orz4q"></b><nobr id="orz4q"></nobr><strike id="orz4q"></strike><input id="orz4q"><label id="orz4q"></label></input><em id="orz4q"></em><form id="orz4q"></form><tbody id="orz4q"><table id="orz4q"><legend id="orz4q"><dl id="orz4q"></dl></legend></table></tbody><tr id="orz4q"></tr><dd id="orz4q"></dd><li id="orz4q"></li><code id="orz4q"></code><menu id="orz4q"><samp id="orz4q"></samp></menu><p id="orz4q"><rp id="orz4q"><u id="orz4q"><strong id="orz4q"></strong></u></rp></p><pre id="orz4q"><em id="orz4q"></em></pre><tbody id="orz4q"><table id="orz4q"></table></tbody><ol id="orz4q"><p id="orz4q"><label id="orz4q"><blockquote id="orz4q"></blockquote></label></p></ol><tr id="orz4q"><option id="orz4q"></option></tr><legend id="orz4q"></legend><p id="orz4q"><rp id="orz4q"><output id="orz4q"><strong id="orz4q"></strong></output></rp></p><menu id="orz4q"></menu><rt id="orz4q"></rt><rp id="orz4q"></rp><optgroup id="orz4q"></optgroup><del id="orz4q"></del><button id="orz4q"></button><rp id="orz4q"></rp><dfn id="orz4q"><font id="orz4q"><sub id="orz4q"><td id="orz4q"></td></sub></font></dfn><nav id="orz4q"><blockquote id="orz4q"></blockquote></nav><thead id="orz4q"><menuitem id="orz4q"><progress id="orz4q"><noscript id="orz4q"></noscript></progress></menuitem></thead><sup id="orz4q"><acronym id="orz4q"></acronym></sup><center id="orz4q"></center><font id="orz4q"></font><noscript id="orz4q"><div id="orz4q"></div></noscript><font id="orz4q"></font><wbr id="orz4q"><noscript id="orz4q"></noscript></wbr><meter id="orz4q"></meter><optgroup id="orz4q"><xmp id="orz4q"><big id="orz4q"><em id="orz4q"></em></big></xmp></optgroup><nav id="orz4q"></nav><input id="orz4q"><label id="orz4q"><menuitem id="orz4q"><progress id="orz4q"></progress></menuitem></label></input><address id="orz4q"></address><dl id="orz4q"></dl><progress id="orz4q"></progress><video id="orz4q"></video></div> <a href="http://www.themmauniversity.com/">պƷһAV_aŷպƷ_Ů߳ڵѿ_ŷƷһһ</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> </html>