锘??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕亚洲专区,国产精一品亚洲二区在线播放,亚洲av午夜电影在线观看http://www.tkk7.com/wenhl5656/category/45754.html鎯寵搗鍜岃佽倴鐮旂┒涓柇鐨勬棩瀛愶紝鍊嶈娓╅Θzh-cnMon, 09 Aug 2010 03:56:44 GMTMon, 09 Aug 2010 03:56:44 GMT60pImpl Idiomhttp://www.tkk7.com/wenhl5656/archive/2010/08/07/328217.html鐖卞悆楸煎ご鐖卞悆楸煎ごSat, 07 Aug 2010 14:58:00 GMThttp://www.tkk7.com/wenhl5656/archive/2010/08/07/328217.htmlhttp://www.tkk7.com/wenhl5656/comments/328217.htmlhttp://www.tkk7.com/wenhl5656/archive/2010/08/07/328217.html#Feedback0http://www.tkk7.com/wenhl5656/comments/commentRss/328217.htmlhttp://www.tkk7.com/wenhl5656/services/trackbacks/328217.html闄嶄綆鏂囦歡闂寸殑緙栬瘧渚濊禆鍏崇郴錛岄氳繃鎶婁竴涓狢lass鍒嗘垚涓や釜Class錛屼竴涓彧鎻愪緵鎺ュ彛錛屽彟涓涓礋璐e疄鐜拌鎺ュ彛錛屽疄鐜版帴鍙d笌瀹炵幇鐨勫垎紱匯傝繖涓垎紱葷殑鍏抽敭鍦ㄤ簬鈥滀互澹版槑鐨勪緷璧栨р濇浛鎹⑩滃畾涔夌殑渚濊禆鎬р濓紝鑰岀紪璇戜緷璧栨ф渶灝忓寲鐨勬湰璐ㄦ槸:璁╁ご鏂囦歡灝藉彲鑳界殑鑷垜婊¤凍錛屼竾涓鍋氫笉鍒幫紝鍒欒瀹冧笌鍏朵粬鏂囦歡鍐呯殑澹版槑寮忥紙鑰岄潪瀹氫箟寮忥級鐩鎬緷銆?br />
寮曠敤榪欓噷鐨勪竴浜涙弿榪幫細
The Pimpl idiom, also known as the compilation firewall or Cheshire Cat technique, is a "private implementation" technique useful only in CeePlusPlus and statically compiled languages like it...

Benefits:
  1. Changing private member variables of a class does not require recompiling classes that depend on it, thus make times are faster, and the FragileBinaryInterfaceProblem is reduced.
  2. The header file does not need to #include classes that are used 'by value' in private member variables, thus compile times are faster.
  3. This is sorta like the way SmallTalk automatically handles classes... more pure encapsulation.
Drawbacks:
  1. More work for the implementor.
  2. Doesn't work for 'protected' members where access by subclasses is required.
  3. Somewhat harder to read code, since some information is no longer in the header file.
  4. Run-time performance is slightly compromised due to the pointer indirection, especially if function calls are virtual (branch prediction for indirect branches is generally poor).
How to do it:
  1. Put all the private member variables into a struct.
  2. Put the struct definition in the .cpp file.
  3. In the header file, put only the ForwardDeclaration of the struct.
  4. In the class definition, declare a (smart) pointer to the struct as the only private member variable.
  5. The constructors for the class need to create the struct.
  6. The destructor of the class needs to destroy the struct (possibly implicitly due to use of a smart pointer).
  7. The assignment operator and CopyConstructor need to copy the struct appropriately or else be disabled.
Code錛?/font>
1聽聽struct聽AImp;
2聽聽class聽A聽{
3聽聽public:
4聽聽聽聽//聽Same聽public聽interface聽as聽A,聽but聽all聽delegated聽to聽concrete聽implementation.
5聽聽private:
6聽聽聽聽AImp聽*聽pimpl;
7聽聽};
8


If you use a SmartPointer and you only have one implementation, there is no need to make any of the member functions virtual, except possibly the destructor. The run-time cost of non-virtual member function calls is much lower, and a compiler that does whole-program optimization can inline them even though they're in a separate translation unit. Here's an example:
聽1//聽foo.h
聽2
聽3聽聽class聽foo_impl;
聽4
聽5聽聽class聽foo聽{
聽6聽聽聽聽//聽Boilerplate
聽7聽聽聽聽friend聽class聽foo_impl;
聽8聽聽聽聽foo()聽{}聽//聽so聽only聽foo_impl聽can聽derive聽from聽foo
聽9聽聽聽聽const聽foo_impl聽*聽impl()聽const;
10聽聽聽聽foo_impl聽*聽impl();
11聽聽public:
12聽聽聽聽virtual~foo()聽{}
13聽聽聽聽//聽Factories
14聽聽聽聽static聽std::auto_ptr<foo>聽create(int聽value);
15聽聽聽聽//聽Interface
16聽聽聽聽int聽value()聽const;
17聽聽};
18
19聽聽//聽foo.cpp
20
21聽聽class聽foo_impl聽:聽public聽foo聽{
22聽聽聽聽friend聽class聽foo;
23聽聽聽聽//聽Constructors聽mirroring聽the聽factory聽functions聽in聽foo
24聽聽聽聽explicit聽foo_impl(int聽value)聽:聽value_(value)聽{}
25聽聽聽聽//聽Member聽data
26聽聽聽聽int聽value_;
27聽聽};
28
29聽聽inline聽const聽foo_impl聽*聽foo::impl()聽const聽{
30聽聽聽聽return聽static_cast<const聽foo_impl聽*>(this);
31聽聽}
32聽聽inline聽foo_impl聽*聽foo::impl()聽{
33聽聽聽聽return聽static_cast<foo_impl聽*>(this);
34聽聽}
35
36聽聽std::auto_ptr<foo>聽foo::create(int聽value)聽{
37聽聽聽聽return聽std::auto_ptr<foo>(new聽foo_impl(value));
38聽聽}
39
40聽聽int聽foo::value()聽const聽{聽return聽impl()->value_;聽}
41
42

Here, the destructor needs to be declared virtual foo so that std::auto_ptr<foo> calls foo_impl's destructor. If you use boost::shared_ptr<foo> instead, even that doesn't need to be virtual, because shared_ptr remembers how to call the correct destructor. (This doesn't improve performance or memory use, because shared_ptr is larger and slower than auto_ptr, but if you need to use shared_ptr anyway you may as well eliminate the virtual destructor.) -- BenHutchings


鍙傝冮槄璇伙細

Effective C++
http://c2.com/cgi/wiki?PimplIdiom
http://en.wikipedia.org/wiki/Opaque_pointer


]]>
Effective C++ - 09.緇濆涓嶈鍦ㄦ瀯閫犲拰鏋愭瀯榪囩▼涓皟鐢ㄨ櫄鍑芥暟http://www.tkk7.com/wenhl5656/archive/2010/07/28/327365.html鐖卞悆楸煎ご鐖卞悆楸煎ごWed, 28 Jul 2010 13:37:00 GMThttp://www.tkk7.com/wenhl5656/archive/2010/07/28/327365.htmlhttp://www.tkk7.com/wenhl5656/comments/327365.htmlhttp://www.tkk7.com/wenhl5656/archive/2010/07/28/327365.html#Feedback0http://www.tkk7.com/wenhl5656/comments/commentRss/327365.htmlhttp://www.tkk7.com/wenhl5656/services/trackbacks/327365.html瑕佺偣錛氱粷瀵逛笉搴旇鍦ㄦ瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟涓皟鐢ㄨ櫄鍑芥暟銆?br />
Derived Class瀵硅薄鍐呯殑Base Class鎴愬垎浼氬湪Derived Class鑷韓鎴愬垎琚瀯閫犱箣鍓嶆瀯閫犲畬鎴愩傚鏋淏ase Class鏋勯犲嚱鏁頒腑鏈夎櫄鍑芥暟錛坴irtual function錛夛紝璇irtual function緇濆涓嶄細涓嬮檷鍒癉erived Class灞備腑錛岃屾槸鐩存帴璋冪敤Base Class涓鍑芥暟錛岄氫織鐨勮錛屽嵆鈥斺斿湪Base Class鏋勯犳椂錛寁irtual function涓嶅啀琚綋鎴恦irtual function銆?br />
榪欐槸鍥犱負錛屽湪Base Class鏋勯犳湡闂達紝瀵硅薄鐨勭被鍨嬫槸Base Class鑰屼笉鏄疍erived Class銆備笉鍙槸铏氬嚱鏁頒細琚紪璇戝櫒瑙f瀽鑷矪ase Class涓紝鑻ヤ嬌鐢ㄨ繍琛屾湡綾諱俊鎭紙runtime type information錛屼緥濡俤ynamic_cast鍜宼ypeid錛夛紝涔熶細鎶婂璞¤涓築ase Class綾誨瀷銆傚悓鏍瘋繖涔熼傚悎浜庢瀽鏋勫嚱鏁般備竴鏃︾敱Derived Class鐨勬瀽鏋勫嚱鏁拌繘鍏ュ埌BaseClass鐨勬瀽鏋勫嚱鏁板悗錛屽璞″氨鎴愪負涓涓狟aseClass鐨勫璞′簡銆?br />


鐖卞悆楸煎ご 2010-07-28 21:37 鍙戣〃璇勮
]]>
主站蜘蛛池模板: AV大片在线无码永久免费| 91精品成人免费国产| 免费在线观看的网站| 亚洲无限乱码一二三四区| 日韩精品极品视频在线观看免费| 中文字幕亚洲日本岛国片| jizz免费在线影视观看网站| 亚洲国产一区二区视频网站| 亚洲精品黄色视频在线观看免费资源| 亚洲精品色婷婷在线影院| 黄色视频在线免费观看| 国产亚洲av人片在线观看| 国产免费爽爽视频在线观看| 亚洲avav天堂av在线不卡| 国产成人免费在线| 亚洲天堂2016| 国产精品免费视频一区| 一个人晚上在线观看的免费视频| 亚洲乱码无码永久不卡在线 | 在线观看AV片永久免费| 中文字幕在线观看亚洲日韩| 国产在线98福利播放视频免费| 日本一区二区三区在线视频观看免费 | 亚洲国产日韩视频观看| 国产大片91精品免费观看男同| 手机永久免费的AV在线电影网| 亚洲成a人片在线观看无码| 久久久久久曰本AV免费免费| 亚洲国产精品ⅴa在线观看| 亚洲精品成人区在线观看| 91福利免费网站在线观看| 亚洲导航深夜福利| 免费一级毛片不卡在线播放| 免费看一区二区三区四区| 亚洲人成电影在线观看青青| 国产成人免费A在线视频| 搡女人免费免费视频观看| 亚洲乱码一二三四区乱码| 亚洲国产精品一区二区九九 | 乱爱性全过程免费视频| 亚洲成人激情在线|