?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> c++实现反射c?׃软g开发公?南软g开发|׃软g开?南赢dU技软g开发公?/title> <meta name="keywords" content="c++实现反射c?׃软g开发公?/> <meta name="description" content="在很多程序设计中Q经怼遇到q样的需求,卛_以通过cȝ名字得到对应cd的对象,其是一U数据需要很多策略处理的时候。比如对于网늱型的识别Q一网可能是视频cd、新ȝ型、图片类型、网站首c百U等很多"/> <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++实现反射c?׃软g开发公?/h1> <div class="article_author">d旉Q?016-12-20 17:02:06 文章作者:<a href="/">南软g开?/a> 览ơ数Q?Script Language="Javascript" Src="/item/GetHits.asp?Action=Count&GetFlag=0&m=1&ID=3053"></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;">在很多程序设计中Q经怼遇到q样的需求,卛_以通过cȝ名字得到对应cd的对象,其是一U数据需要很多策略处理的时候。比如对于网늱型的识别Q一网可能是视频cd、新ȝ型、图片类型、网站首c百U等很多cd中的一U,|页cd对于搜烦引擎来说是非帔R要的Q计rank的时候网늱型往往是一个非帔R要的因子。具体实现的时候,|页cd识别的策略可以封装在cMQ这样一个策略就可以设计成一个类。但是后期随着对网느解的来深入,׃出现以下两种情景Q?/strong></p><p> </p><p><strong style="margin: 0px; padding: 0px;">需要添加新的网늱型,因此需要添加对应的cd识别c;</strong><br style="margin: 0px; padding: 0px;"/> </p><p>有些cd已经不再需要或者是q行了重新划分,那么需要删除掉q些cd或者是让这些类型识别模块不再生效?br style="margin: 0px; padding: 0px;"/> </p><p>  <strong style="margin: 0px; padding: 0px;"><a href="/" style="margin: 0px; padding: 0px; color: rgb(51, 51, 51); text-decoration: none;">׃软g开发公?/a></strong>q种应用场景下,d或移除网늱型识别模块时Q最好能够非常方便,q且不会影响到已有的E序?/p><p> </p><p>  一个比较好的方案是Q定义一个类型识别的基类PageTypeDetectorQ每个类型识别策略都l承自这个基cR比如需要一个新闻页识别的新{略Q那么定义类NewsPageTypeDetectorQ该cȝ承PageTypeDetector。在dNewsPageTypeDetector到网늱型识别的ȝ序时Q在配置文g中进行配|,dNewsPageTypeDetectorc,让该cȝ效,而主E序和其他类型识别策略的E序都不需要进行改动。另外,如果不再需要图片网늱型识别,那么把囄cd识别对应的类名直接从配置发文件中删除卛_?br style="margin: 0px; padding: 0px;"/> </p><p>  Z实现上述目标Q我们需要从cd到类型的映射Q可以称为反。因为配|文件中的信息在E序内部得到的都是纯字符ԌE序需要根据字W串生成对应的识别类。当Ӟq个在本w已包含反射机制的程序设计语a中很Ҏ实现Q比如JAVAQ但是由于C++中语a本n不支持这U机Ӟ因此Q需要用其他的方法来模拟q种机制?br style="margin: 0px; padding: 0px;"/> </p><p>  首先Q我们从最单的方式开始,定义一个工厂方法,该方法负责根据类名生成相应类的对象,函数定义可以如下 <br style="margin: 0px; padding: 0px;"/> </p><p>PageTypeDetector* DetectorFactoryCreate(const string& class_name);<br style="margin: 0px; padding: 0px;"/> </p><p>  生成新闻|页cd识别的类可以如下调用Q?/p><p> </p><p>PageTypeDetector* news_page_detector = DetectorFactoryCreate("NewsPageTypeDetector");</p><p>  DetectorFactoryCreate工厂Ҏ中的实现逻辑大致是这P</p><p> </p><p>if (class_name == "NewsDocTypeDetector") {</p><p>    return new NewsDocTypeDetector;</p><p>} else if (class_name == "...") {</p><p>    return new ...;</p><p>}</p><p>  使用如上工厂Ҏ创徏cȝ方式h非常明显的缺P每添加或删除一个新c,都需要修改工厂方法内的程序(dif判断或者删除if判断Qƈ且需要添加新cȝ头文件或者类声明Q,当然了,因ؓE序有了修改所以就需要重新编译(如果很多其他模块依赖该程序的话,重新~译也是一W不的开销Q。显Ӟq种方式虽然单,但是极不易于l护?/p><p> </p><p>  q里Q提Z个用非常方便ƈ且易于维护的解决ҎQ那是使用宏。虽然c++创始人Bjarne Stroustrup极力反对使用宏,但是在一些特定的场景中合理的使用宏会带来意想不到的效果?/p><p><strong style="margin: 0px; padding: 0px;">  <a href="/" style="margin: 0px; padding: 0px; color: rgb(51, 51, 51); text-decoration: none;">׃软g开发公?/a>首先Q从使用宏最单的一个实现开始,目标是可以通过cȝ名字得到相应的对象,因此应该有个ҎcM于如下:</strong></p><p> </p><p>1Any GetInstanceByName(const string& class_name)Q?br style="margin: 0px; padding: 0px;"/> </p><p>  q回gؓAnyQ因Z知道q回值究竟是什么类型,所以假定可以返回Q何类型,q里的Any使用的是Boost中的Any。该Ҏ中需要new一个类型ؓclass_name的对象返回,那么应该如何new该对象呢?借用上面使用工厂Ҏ的经验,可以q一步用工厂类Q对于每个类Q都有一个相应的工厂cObjectFactoryClassNameQ由该工厂类负责生成相应的对象(Z么要使用工厂c?后面再作单介l)?/p><p> </p><p>  有了工厂c,也需要将cd与工厂类对应hQ对应方式可以用map<string, ObjectFactory*> object_factory_mapQobject_factory_map负责从类名到相应工厂cȝ映射Q这P可以通过cȝ名字扑ֈ对应ObjectFactoryQ然后用ObjectFactory生成相应的对象。但是如何将相应的工厂类d到object_factory_map中去呢,我们需要在定义新类的时候就对应的工厂cL加到object_factory_map中,q里需要一个函数负责添加工厂类到object_factory_map中去Qؓ什么需要一个函数负责?最后作单说明)?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">  负责新cd应的工厂cL加到全局变量object_factory_map的函数必d使用object_factory_map之前执行。gcc中有一个关键字__attribute__((constructor)) Q用该关键字声明的函数可以在main函数之前执行。到现在Q程序的l构cMq样Q?/strong></p><p> </p><p> </p><p> </p><p> </p><p>// 负责实现反射的文件reflector.h:</p><p> </p><p>map<string, ObjectFactory*> object_factory_map;</p><p>Any GetInstanceByName(const string& name) {</p><p>    if (object_factory_map.find(name) != object_factory_map.end()) {</p><p>        return object_factory_map[name]->NewInstance();</p><p>    }</p><p>    return NULL;</p><p>}</p><p> </p><p>#define REFLECTOR(name) \</p><p>class ObjectFactory##name { \ </p><p>public: \</p><p>  Any NewInstance() { \</p><p>    return Any(new name); \</p><p>    } \</p><p>}; \</p><p>void register_factory_##name() { \</p><p>    if (object_factory_map.find(#name) == object_factory_map.end()) { \</p><p>      object_factory_map[#name] = new ObjectFactory##name(); \</p><p>    } \</p><p>} \</p><p>__attribute__(constructor)void register_factory##name();</p><p> </p><p> </p><p>// 调用文gtest.cc</p><p>class TestClass {</p><p>public:</p><p>  void Out() {</p><p>    cout << "i am TestClass" << endl;</p><p>  }</p><p>};</p><p>REFLECTOR(TestClass);</p><p> </p><p>// main函数</p><p>int main() {</p><p>  Any instance = GetInstanceByName("TestClass");</p><p>  TestClass* test_class = instance.any_cast<TestClass>();</p><p>  return 0;  </p><p>}</p><p> </p><p> </p><p>  到这里还有一个问题,全局变量ObjectFactoryMap是不能放在头文g中的Q因为如果多个类包含该头文gӞ׃出现重复定义的错误,是编译不q的。因此,该变量攑֜其源码reflector.cc文g中:</p><p> </p><p> </p><p>// reflector.hQ包含声明:</p><p>extern map<string, ObjectFactory*> object_factory_map;</p><p>Any GetInstanceByName(const string& name)Q?/p><p> </p><p>// reflector.ccQ?/p><p>map<string, ObjectFactory*> object_factory_map;</p><p>Any GetInstanceByName(const string& name) {</p><p>    if (object_factory_map.find(name) != object_factory_map.end()) {</p><p>        return object_factory_map[name]->NewInstance();</p><p>    }</p><p>    return NULL;</p><p>}</p><p>  上述E序~译能够通过Q但是运行时出错Q后来定位到是在使用全局变量object_factory_map时出错,l过调试了很久,在网上查相应的资料也没找到。经q不停的试Q才发现原来是全局变量object_factory_map没有初始化,在仔l的试了以后发玎ͼ是__attribute__((constructor))与全局变量cL造函数的执行序的问题,一般全局变量是在__attribute__(constructor)前完成初始化的,但是如果__attribute__是在main函数所在的文gQ而全局变量是在其他文g定义的,那么__attribute__(constructor)׃在全局变量cL造函数前面执行,q样Q上面的E序在全局变量c还没有完成初始化,也就是还没有执行构造函敎ͼ在__attribute__(constructor)声明的函Cq行了用,因此会出现问题。不q,在执行__attribute__时已l看C全局变量的定义,只是没有执行全局变量的构造函敎ͼq里Q如果全局变量不是c,而是普通类型,是没有问题的Q。所以,E序的结构还需要进一步修攏V?/p><p> </p><p><strong style="margin: 0px; padding: 0px;">    </strong><strong style="margin: 0px; padding: 0px;"><a href="/" style="margin: 0px; padding: 0px; color: rgb(51, 51, 51); text-decoration: none;">׃软g开发公?/a></strong><strong style="margin: 0px; padding: 0px;">现在解决如何定义和用全局变量object_factory_map的问题。既然我们不能直接用该变量Q那么可以通过昄调用函数来返回该变量Q如果直接在函数中new一个对象返回的话,那么每次调用都会new一个新的对象,而我们全局只需要一个该对象Q这时该是static出现的时候了。我们可以这样定义:</strong></p><p> </p><p>// reflector.cc</p><p>map<string, ObjectFactory*>& object_factory_map() {</p><p>    static map<string, ObjectFactory*>* factory_map = new map<string, ObjectFactory*>;</p><p>    return *factory_map;</p><p>}</p><p>q样定义q有另外一个优点,E序只是在真正需要调用g_objectfactory_map时才会生成相应的对象Q而如果程序没有调用,也不会生成对应的对象。当Ӟ在这里new一个对象的代h不大Q但是如果new的对象非常耗时的话Q这U用函Cstatic变量代替全局变量Ҏ的优势就非常明显了。到现在反射E序变成如下q样Q?/p><p> </p><p> </p><p>// 负责实现反射的文件reflector.h:</p><p> </p><p>// 工厂cȝ基类</p><p>class ObjectFactory {</p><p> public:</p><p>  virtual Any NewInstance() {</p><p>    return Any(); </p><p>  }</p><p>};</p><p> </p><p>map<string, ObjectFactory*>& object_factory_map();</p><p>Any GetInstanceByName(const string& name);</p><p> </p><p>#define REFLECTOR(name) \</p><p>class ObjectFactory##name : public ObjectFactory { \ </p><p> public: \</p><p>  Any NewInstance() { \</p><p>    return Any(new name); \</p><p>  } \</p><p>}; \</p><p>void register_factory_##name() { \</p><p>    if (object_factory_map().find(#name) == object_factory_map().end()) { \</p><p>      object_factory_map()[#name] = new ObjectFactory##name(); \</p><p>    } \</p><p>} \</p><p>__attribute__(constructor)void register_factory##name()</p><p> </p><p> </p><p> </p><p>// reflector.cc</p><p> </p><p>map<string, ObjectFactory*>& object_factory_map() {</p><p>    static map<string, ObjectFactory*>* factory_map = new map<string, ObjectFactory*>;</p><p>    return *factory_map;</p><p>}</p><p> </p><p>Any GetInstanceByName(const string& name) {</p><p>    if (object_factory_map().find(name) != object_factory_map().end()) {</p><p>        return object_factory_map()[name]->NewInstance();</p><p>    }</p><p>    return NULL;</p><p>}</p><p>  到现在接q尾CQ不q在很多时候,我们都是在已有基cȝ基础上添加新的类Q就好比上述|页识别的程序,各个识别{略c都l承共同的基c,q样Q我们可以进一步修改反程序,GetInstanceByName攑֜另外一个类中,q回的是基类的指针,因此在定义基cL也需要注册一个宏Q如下所C,同时需要修改objector_factory_map的结构ؓmap<string, map<string, ObjectFactory> >Q第一个key是基cȝ名字Q第二map中的key是生成类的名字,基类宏的定义cM如下Q?/p><p> </p><p>#define REFLECTOR_BASE(base_class) \</p><p>class base_class##Reflector { \</p><p> public: \</p><p>  static base_class* GetInstanceByName(const string& name) { \</p><p>     map<string, ObjectFactory*>& map = object_factory_map()[#base_class]; \</p><p>     map<string, ObjectFactory*>::iterator iter = map.find(name); \</p><p>     if (iter == map.end()) { \</p><p>       return NULL; \</p><p>     } \</p><p>      Any object = iter->second->NewInstance(); \</p><p>      return *(object.any_cast<base_class*>()); \</p><p>} \</p><p>};</p><p>  q里׃再详l讲修改后的代码了,有兴的朋友可以自己实现?/p><p> </p><p> </p><p> </p><p>注:</p><p> </p><p>  至于上面Z么需要用工厂类Q而不是直接new一个对应的对象q回Q原因是直接new是不可以的。例如如下定?nbsp;</p><p>#define REFLECT(name) \</p><p>Any GetInstanceByName(const string& class_name) {</p><p>    return Any(new name);</p><p>}</p><p>  如果是多个类使用的话Q那么就会出现多个函数的定义。如果也借助工厂cȝ实现Q如下实玎ͼ</p><p> </p><p> </p><p>#define REFLECT(name) \</p><p>Any GetInstanceByName##name(const string& class_name) {</p><p>    return Any(new name);</p><p>}</p><p>   q样是不会出现重复定义了Q但是这样在生新的对象旉要指定特定的函数Q这不又回到原点了吗Q因此工厂类充当的是个中介的角色Q我们可以保存工厂类Q然后根据名U寻扄定的工厂cL生成对应的对象?/p><p> </p><p>注:</p><p> </p><p> Z么需要用函数添加工厂类Q因为在E序中,全局I间中只能是变量的声明和定义Q而不能是语句Q例如:</p><p> </p><p>可以q样写:</p><p>int a = 10;</p><p>int main() {}</p><p>但是不能q样写:</p><p>int a;</p><p>a = 10;</p><p>int main() {}</p><p> </p><p><strong style="margin: 0px; padding: 0px;">需要注意的知识点:</strong></p><p> </p><p><strong style="margin: 0px; padding: 0px;">工厂模式Q?/strong></p><p><strong style="margin: 0px; padding: 0px;">全局变量的定义需要注意,不能定义在头文g中(当如Q如果经q特D处理,例如使用#ifndef保护另说Q;</strong></p><p><strong style="margin: 0px; padding: 0px;">Anycd的实玎ͼQ准备写另外一文章来探讨其实现细节)</strong></p><p><strong style="margin: 0px; padding: 0px;">宏的定义以及使用Q(基本覆盖了宏的所有知识)</strong></p><p><strong style="margin: 0px; padding: 0px;">全局变量构造函C__attribute__((constructor))的执行顺序;Q调试了很久Q?/strong></p><p><strong style="margin: 0px; padding: 0px;">__attribute__((constructor))的问题;Q编译器有关Q放在函数定义前或定义后Q?/strong></p><p><strong style="margin: 0px; padding: 0px;">全局I间只能是声明或者定义,不能是语句;</strong></p><p><strong style="margin: 0px; padding: 0px;">static在函C的用;</strong></p><p><strong style="margin: 0px; padding: 0px;">全局变量cȝ定义与用?/strong></p><p><strong style="margin: 0px; padding: 0px;"><br/></strong></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>