??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕一区二区三区久久网站,久久99国产综合精品,亚洲国产精品久久久久网站 http://www.shnenglu.com/bloodsuck/玩玩zh-cnWed, 07 May 2025 17:08:03 GMTWed, 07 May 2025 17:08:03 GMT601个短的实例Q显C构建和中序遍历2叉查找树http://www.shnenglu.com/bloodsuck/archive/2009/05/13/82842.html黄大?/dc:creator>黄大?/author>Wed, 13 May 2009 09:21:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2009/05/13/82842.htmlhttp://www.shnenglu.com/bloodsuck/comments/82842.htmlhttp://www.shnenglu.com/bloodsuck/archive/2009/05/13/82842.html#Feedback0http://www.shnenglu.com/bloodsuck/comments/commentRss/82842.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/82842.html 

 

  1#include "stdafx.h"
  2#include <iostream>
  3using namespace std;
  4
  5template <typename T>
  6class BinarySearchTree
  7{
  8 friend  ostream& operator<<(ostream& , BinarySearchTree<T>& );
  9public:
 10 BinarySearchTree();
 11 void insert(const T );
 12 void midvisit()
 13 {
 14
 15  midvisit(root);
 16 }

 17   
 18protected:
 19
 20private:
 21 class TNode
 22 {
 23  friend class BinarySearchTree;
 24 public:
 25  TNode(T a)
 26   :data(a),
 27   left(NULL),
 28   right(NULL)
 29  {
 30
 31  }

 32 protected:
 33 private:
 34  T data;
 35  TNode* left;
 36  TNode* right;
 37 }
;
 38 void insert(const T ,TNode*&);
 39 void midvisit(TNode* x)
 40 {
 41  if (x==NULL)
 42  {
 43   return;
 44  }

 45  midvisit(x->left);
 46  cout<<x->data;
 47  midvisit(x->right);
 48
 49 }

 50TNode* root;
 51
 52
 53}
;
 54template<typename T2>
 55ostream& operator<<(ostream& os, BinarySearchTree<T2>& a)
 56{
 57    
 58
 59}

 60template<typename T>
 61BinarySearchTree<T>::BinarySearchTree()
 62{
 63
 64root=NULL;
 65}

 66template<typename T>
 67void BinarySearchTree<T>::insert(const T a,TNode*& t)
 68{
 69    if (t==NULL)
 70    {
 71  t=new TNode(a);
 72  return;
 73    }

 74 if (a>t->data)
 75 {
 76  insert(a,t->right);
 77 }

 78 else
 79  insert(a,t->left);
 80
 81
 82}

 83template<typename T>
 84void BinarySearchTree<T>::insert(const T a)
 85{
 86 insert(a,root);
 87
 88 
 89
 90
 91}

 92int _tmain(int argc, _TCHAR* argv[])
 93{
 94 BinarySearchTree<int > a;
 95 for (int i=0;i<10;++i)
 96 {
 97  a.insert(i);
 98 }

 99 cout<<"insert data"<<endl;
100    a.midvisit();
101 return 0;
102}

103


]]>
数组析http://www.shnenglu.com/bloodsuck/archive/2008/06/06/52331.html黄大?/dc:creator>黄大?/author>Fri, 06 Jun 2008 02:37:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2008/06/06/52331.htmlhttp://www.shnenglu.com/bloodsuck/comments/52331.htmlhttp://www.shnenglu.com/bloodsuck/archive/2008/06/06/52331.html#Feedback0http://www.shnenglu.com/bloodsuck/comments/commentRss/52331.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/52331.htmlint b[20][10]

 cdQ?br>a:   int [10]
b:   int [20][10]
a, b 都是叛_?br> _装换U别cdQ?br> a--->int *
b ---->int (*)[10]
  地址cd
&a : int (*)[10]
&b:int (*)[20][10] 
  

问题Q如何在堆中动态分配多l数l?br>思\Q降l分?br>int ** p;
int a=30;
int b=50;
p=new int * [30];//2l分?br>*(p+1)=new int [50];
*(p+2)=new int [50];
一l是q箋地址
2l是非连l的

另种思\Q结构指?br>struct color
{
  int * a;
}
color * b;
b=new color[50];
b[1].a=new int [60];

]]>
1U钟的命q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2007/07/18/28261.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Wed, 18 Jul 2007 02:42:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2007/07/18/28261.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/28261.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2007/07/18/28261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/28261.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/28261.html</trackback:ping><description><![CDATA[<p>                        在这U关键的时刻Q那些^时慢慢悠悠顺序发生和q列发生的事Q都压羃在这样一个决定一切的短暂时刻表现出来。这一时刻对世世代代作Z可改变的军_Q它军_着一个h的生歅R一个民族的存亡甚至整个人类的命q?<br>命运Lq着强有力的人物和不可一世者走厅R多年来,命运L使自己屈从于q样的个人:凯撒、亚历山大、拿破仑Q因为命q喜Ƣ这些像自己那样不可捉摸的强权h物?/p> <p>但是有时候,当然Q这在Q何时代都是极为罕见的Q命q也会出于一U奇怪的心情Q把自己抛到一个^怹辈的手中。有时候——这是世界历史上最令h惊奇的时删Z—命q之U在瞬息旉内是掌握在一个窝囊废手中。英雄们的世界游戏像一阵风暴似的也把那些^怹辈卷了进来。但是当重QH然降C们n上时Q与其说他们感到庆幸Q毋宁说他们更感到骇怕。他们几乎都是把抛过来的命运又哆哆嗦嗦地从自己手里失落。一个^怹辈能抓住机缘使自己^步青云,q是很难得的。因Z大的事业降到ؓh物的w上Q仅仅是短暂的瞬间。谁错过了这一瞬间Q它l不会再恩赐W二遍?/p> <p>格鲁?/p> <p>l也U会议正在D行。在玩弄权术和互怺吵之中,像一枚嗖嗖的炮弹飞来q样的消息:拿破仑这头被困的雄狮自己从厄巴岛的牢笼中闯出来了;拿破仑赶C国王Q军队又都狂热地丄旗帜投奔C那一?#8230;…好像被一只利爪攫住,那些刚刚q在互相抱怨的大臣们又都聚集在一P他们再次联合hQ彻底击败这个篡权者。威灵顿开始从北边向法国进军,一支由布吕歇尔布统率的普鲁士军Q作Z的增援部队从另一方向前进。施瓦尔岑贝格在p河畔整装待发Q而作为后备军的俄国军团,正带着全部辎重Q缓慢地I过德国?/p> <p>拿破仑看清了q种致命的危险。他必须在普鲁士人、英国h、奥地利合成Z支欧z盟军前将他们分而攻之,各个ȝ。于是他匆忙把赌注押在欧z流血最多的战场——比利时。(1815q_6?6日拿破仑大军的先头部队在林尼与普鲁士军遭遇,q将普军击|。这是这头雄狮的W一ơ猛击,q一击非常厉宻I然而却不致命。被击|而ƈ未被消灭的普军向布鲁塞尔撤退?/p> <p>拿破仑准备向威灵的部队q攻。他不允许自己喘息,也不允许Ҏ喘息Q因为每拖g一天,意味着l对方增d量?7日,拿破仑率领全军到辑֛臂村高地前,威灵这个对手已在高C{好工事Q严阵以待。拿破仑充分估计到自己面临的各种危险Q即布吕歇尔的军队仅仅是被击败,而ƈ未被消灭。这支军队随时可能与威灵的军队会合。ؓ了防止这U可能性,他抽调出一部分部队去跟t追L鲁士军,以阻止他们与英军会合?/p> <p>他把q支q击部队交给了格鲁希元帅指挥。格鲁希Q一个气度中庸的男子Q老实可靠Q兢兢业业。他既没有缪拉那L胆识力Q也没有圣西那Lx多谋Q更~Z内伊那样的英雄气概。关于他Q没有神话般的传_也没有谁把他描绘成威风凛凛的勇士。他从戎20q_他是~慢地、一U一U地升到元帅的军衔。拿破仑大概也知道,格鲁希既不是气吞山河的英雄,也不是运{帷q的谋士。但是他自己的元帅,一半已在黄泉之下,而其余几位已对这U没完没了的风餐露宿的戎马生zd分厌倦,正怏怏不乐地呆在自己的庄园里呢。所以,拿破仑是Z无奈才对q个中庸的男子委以重ȝ?/p> <p>17日上?1Ӟ拿破仑第一ơ把独立指挥权交l格鲁希元帅。就在这一天,在这短暂的瞬_唯唯的格鲁希跛_一x从的军h习气Q自pq世界历史的行列。拿破仑的命令是清楚的:当他自己向英军进LQ格鲁希务必率领交给他的三分之一兵力去追L鲁士军,而且他必dl和d部队保持联系?/p> <p>格鲁希元帅踌w地接受了这命令。他不习惯独立行事。只是当他看到皇帝的天才目光Q才感到心里t实Q应承下来。格鲁希的部队在瓢泼大雨中出发?/p> <p>军_世界历史的一瞬间</p> <p>18日上?1点,炮手们接到命令:用榴弹炮轰击山头上的w穿U衣的英国士c接着Q内伊——这?#8220;雄中之杰”Q率领步兵发起冲锋。从上午11点至下午1点,法军师团向高地进攻,一度占领了村庄和阵圎ͼ但又被击退下来Q而又发vq攻。在I旷、惔泞的山坡上已覆盖着1万具怽。可是除了大量消耗以外,什么也没有辑ֈ。双方的军队都已疲惫不堪Q双方的l帅都焦虑不安。双斚w知道Q谁先得到增_谁就是胜利者。威灵顿{待着布吕歇尔Q拿破仑盼望着格鲁希?/p> <p>但是Q格鲁希q未意识到拿破仑的命q掌握在他自己手中,他只是遵照命令于17日晚间出发,按预计方向去q击普鲁士军。因为敌人始l没有出玎ͼ被击溃的普军撤退的踪q也始终没有扑ֈ?/p> <p>正当格鲁希元帅在一户农民家里急急忙忙进早餐Ӟ他脚底下的地面突然微微震动v来。所有的人都悉心l听。从q处一再传来沉L、渐渐消q声音Q这是大炮的声音Q是q处炮兵正在开炮的声音Q不qƈ不太q,臛_只有三小时的路程。这是圣让山上的炮火壎ͼ是滑铁卢战役开始的声音。副o热拉急切地要求:“立即向开炮的方向前进Q?#8221;所有的人都毫不怀疑:皇帝已经向英军发hMQ一ơ重大的战役已经开始。可是格鲁希却拿不定L。他习惯于唯命是从,他胆怕事地死q写在U怸的条文——皇帝的命oQ追L退的普军。热拉尔看到他如此犹豫不冻I便恳切地hQ至能让他率领自己的一师部队和若干骑兵到那战场上去。格鲁希考虑了一下。他只考虑了一U钟?/p> <p>然而格鲁希考虑的这一U钟却决定了他自q命运、拿破仑的命q和世界的命q。格鲁希使劲地摇了摇手说Q把q样一支小部队再分散兵力是不负责Q的,他的d是追L军,而不是其他。就q样Q他拒绝了这一q背皇帝命o的行动。而决定性的一U钟在q一片静默之中消逝了Q它一M复返Q以后,无论用怎样的言词和行动都无法I补这一U钟——威灵顿胜利了?/p> <p>格鲁希的部队l箋往前走。随着一时一时的过去,格鲁希越来越没有把握Q因Zo人奇怪的是,普军始终没有出现。显Ӟ他们d了退往布鲁塞尔ȝ方向。接着Q情报h员报告了U种可疑的迹象,说明普军在撤退q程中已分几路{Ud了正在激战的战场。如果这时候格鲁希赶紧率领队伍d援皇帝,q是来得及的。但他只是怀着愈来愈不安的心情Ql等待着消息Q等待着皇帝要他q回的命令。可是没有消息来。只有低沉的隆隆炮声震颤着大地Q炮声却愈来愈远。孤注一L滑铁卢搏斗正在进行,炮弹便是投下来的铁骰子?/p> <p>滑铁卢的下午</p> <p>旉已经C下午一炚w。拿破仑的四ơ进攻虽然被击退下来Q但威灵主阵地的防U显然也出现了空隙。拿破仑正准备发起一ơ决定性的d。这Ӟ他发C北方向有一股黑的h迎面奔来。一支新的部队!</p> <p>所有的望远镜都立刻对准着q个方向。难道是格鲁希大胆地q背命oQ奇q般地及时赶CQ可是不Q一个带上来的俘虏报告说Q这是布吕歇将军的前卫部队Q是普鲁士军队。此刻,皇帝W一ơ预感到Q那支被L的普军ؓ了抢先与英军会合Q已摆脱了追击;而他——拿破仑自己却用了三分之一的兵力在I地上作毫无用处、失ȝ标的q动。他立即l格鲁希写了一信Q命令他不惜一切代仯紧与自己靠拢QƈL普军向威灵顿的战场集l?/p> <p>与此同时Q内伊元帅又接到了进ȝ命o。必d普军到达以前歼灭威灵K队。整个下午,向威灵顿的高地发起了一ơ又一ơ的冲锋。战斗一ơ比一ơ残P投入的步兵一ơ比一ơ多。但是威灵顿依旧岿然不动。而格鲁希那边却始l没有消息来。内伊元帅已军_把全部队伍都拉上去,决一L。于是,1万名D死一战的盔甲骑兵和步骑兵t烂了英军的斚wQ砍M英军的炮手,冲破了英军的最初几道防Uѝ虽然他们自己再ơ被q撤退Q但英军的战斗力已濒于殆。山头上像箍桶似的严密防U开始松散了。当受到重大伤亡的法军骑兵被炮火击退下来Ӟ拿破仑的最后预备队——老近卫军正步履艰隑֜向山头进攅R欧z的命运全系在能否攻占这一山头上?/p> <p>x</p> <p>自上午以来,双方?00门大炮不停地轰击着。前U响彻骑兵队向开火的斚w冲杀的铁y声。从四面八方传来的冬冬战鼓声Q震x聋,整个q_都在颤动Q但是在双方的山头上Q双方的l帅g都听不见q嘈杂的人声。他们只是們֐着更ؓ微弱的声韟?/p> <p>两只表在双方的统帅手中,像小鸟的心脏似的在嘀嗒嘀嗒地响。这轻轻的钟表声过所有震天的吼叫声。拿破仑和威灵顿各自拿着自己的计时器Q数着每一时Q每一分钟Q计着q有多少旉Q最后的军_性的增援部队p到达了。威灵顿知道布吕歇尔在附近。而拿破仑则希望格鲁希也在附近。现在双斚w已没有后备部队了。谁的增援部队先刎ͼ谁就赢得q次战役的胜利?/p> <p>普军的侧终于响起了枪击声。拿破仑深深地吸了一口气Q?#8220;格鲁希终于来了!”他以q侧翼现在已有了保护,于是集中了最后剩下的全部兵力Q向威灵的主阵地再ơ发h凅R这主阵地就是布鲁塞的门闩Q必d它摧毁,q主阵地是Ƨ洲的大门,必须它冲破?/p> <p>然而刚才那一阉|C仅是一会。由于汉诺威兵团I着别样的军装,前来的普军向汉诺威士兵开了枪。但q场误会的遭遇战很快停止了。现在,普军的大批h马毫无阻挡地、浩荡荡地从树林里I出来。厄q就此降临了。这一消息飞快地在拿破仑的部队中传开。部队开始退却。所有剩下的英军一下子全都跃n而vQ向着溃退的敌人冲厅R与此同Ӟ普鲁士骑兵也从侧面向仓皇逃窜、疲于奔命的法军冲杀q去?/p> <p>仅仅几分钟的工夫Q这支赫赫军威的部队变成了一股被人驱赶的抱头鼠窜、惊慌失措的人流。在一片惊恐的混ؕ叫喊CQ他们轻而易丑֜捕获了拿破仑的M用马车和全军的贵重胦物,俘虏了全部炮c只是由于黑夜的降Q才拯救了拿破仑的性命和自由。一直到半夜Q满w污垢、头昏目眩的拿破仑才在一家低矮的乡村客店里,疲倦地w坐在扶手Y椅上Q这Ӟ他已不再是个皇帝了。他的帝国、他的皇朝、他的命q全完了。一个微不道的h物的怯懦毁坏了他q个最有胆识、最有远见的人物?0q里所建立h的全部英雄业l?/p> <p>那关键的一U钟是q样q行了可怕的报复。在世生活中,q样的一瞬间是很降临的。当它无意之中降临到一个hw上Ӟ他却不知如何利用它。在命运降的伟大瞬_市民的一切美德——小心、顺从、勤勉、}慎,都无于事,它始l只要求天才人物Qƈ且将他造就成不朽的形象。命q鄙视地把畏首畏人拒之门外。命q——这世上的另一位神Q只愿意用热烈的双臂把勇敢者高高DP送上英雄们的天堂?/p> <img src ="http://www.shnenglu.com/bloodsuck/aggbug/28261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2007-07-18 10:42 <a href="http://www.shnenglu.com/bloodsuck/archive/2007/07/18/28261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1个Ş式怪异的函?/title><link>http://www.shnenglu.com/bloodsuck/archive/2007/06/12/26156.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Tue, 12 Jun 2007 08:09:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2007/06/12/26156.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/26156.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2007/06/12/26156.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/26156.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/26156.html</trackback:ping><description><![CDATA[<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"><span style="COLOR: #008080">1</span><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">  backarry(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> arrayname )[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]) )  [</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    return arrayname;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>};</span></div>       呵呵Q是有点古?<br><br>  再来?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"><span style="COLOR: #008080"> 1</span><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">  backarry(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> arrayname )[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]) )  [</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]<br></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>      <br></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    return arrayname;<br></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>};<br></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">  backarry(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> arrayname)[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]))[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]<br></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    {<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">i;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    }<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    return arrayname;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>};<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>backarry(</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">);</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">会调用哪个呢Q?<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>}</span></div> <img src ="http://www.shnenglu.com/bloodsuck/aggbug/26156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2007-06-12 16:09 <a href="http://www.shnenglu.com/bloodsuck/archive/2007/06/12/26156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一?Decorator 模式 例子Q原Q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2007/03/22/20338.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Thu, 22 Mar 2007 01:56:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2007/03/22/20338.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/20338.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2007/03/22/20338.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/20338.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/20338.html</trackback:ping><description><![CDATA[ <p> </p> <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"> <span style="COLOR: #008080"> 1</span> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">#pragma once<br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />class component<br /></span> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    component(void);<br /></span> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  virtual void printsefl()</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">   ;<br /></span> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    virtual ~component(void);<br /></span> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span> <span style="COLOR: #008080">11</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">12</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />class concreatecom :</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> component<br /></span> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">14</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">15</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    concreatecom(char</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> );<br /></span> <span style="COLOR: #008080">16</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  virtual void printsefl()   ;<br /></span> <span style="COLOR: #008080">17</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  virtual ~concreatecom(void);<br /></span> <span style="COLOR: #008080">18</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span> <span style="COLOR: #008080">19</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">20</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />char </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> _psz_text;<br /></span> <span style="COLOR: #008080">21</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span> <span style="COLOR: #008080">22</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">23</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />class decorator:</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> component<br /></span> <span style="COLOR: #008080">24</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">25</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">26</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />     decorator(component</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">27</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  virtual void printsefl()     ;<br /></span> <span style="COLOR: #008080">28</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  virtual ~decorator();<br /></span> <span style="COLOR: #008080">29</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span> <span style="COLOR: #008080">30</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">31</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">32</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   component </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> _pcomponent;<br /></span> <span style="COLOR: #008080">33</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span> <span style="COLOR: #008080">34</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />class  headdeco:</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> decorator<br /></span> <span style="COLOR: #008080">35</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">36</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">37</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />       headdeco(component</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">38</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   virtual void printsefl()   ;<br /></span> <span style="COLOR: #008080">39</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   virtual ~headdeco();<br /></span> <span style="COLOR: #008080">40</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span> <span style="COLOR: #008080">41</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    virtual void printhead()  ;<br /></span> <span style="COLOR: #008080">42</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">43</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> _i_head;<br /></span> <span style="COLOR: #008080">44</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span> <span style="COLOR: #008080">45</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">46</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />class enddeco:</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> decorator<br /></span> <span style="COLOR: #008080">47</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">48</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">49</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />      enddeco(component</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">,char</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">50</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    virtual void printsefl() ;<br /></span> <span style="COLOR: #008080">51</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    virtual  ~enddeco();<br /></span> <span style="COLOR: #008080">52</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span> <span style="COLOR: #008080">53</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />      virtual void printend() ;<br /></span> <span style="COLOR: #008080">54</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">:<br /></span> <span style="COLOR: #008080">55</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> char</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> _pch_end;<br /></span> <span style="COLOR: #008080">56</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />};</span> </div> <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"> <span style="COLOR: #008080"> 1</span> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">#include </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">StdAfx.h</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">iostream</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">component.h</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />using namespace std;<br /></span> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />component::component(void)<br /></span> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />component::~component(void)<br /></span> <span style="COLOR: #008080">11</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">12</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">14</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />void concreatecom::printsefl() <br /></span> <span style="COLOR: #008080">15</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">16</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">endl;<br /></span> <span style="COLOR: #008080">17</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">_psz_text ;<br /></span> <span style="COLOR: #008080">18</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">endl;<br /></span> <span style="COLOR: #008080">19</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">20</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> concreatecom::concreatecom(char</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> psz)<br /></span> <span style="COLOR: #008080">21</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">22</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />      _psz_text</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">psz;<br /></span> <span style="COLOR: #008080">23</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">24</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> decorator::decorator(component</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> a):<br /></span> <span style="COLOR: #008080">25</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   _pcomponent(a)<br /></span> <span style="COLOR: #008080">26</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">27</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  <br /></span> <span style="COLOR: #008080">28</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">29</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />concreatecom::~concreatecom()<br /></span> <span style="COLOR: #008080">30</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">31</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">32</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">33</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />void decorator::printsefl()<br /></span> <span style="COLOR: #008080">34</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">35</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />_pcomponent.printsefl();<br /></span> <span style="COLOR: #008080">36</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    <br /></span> <span style="COLOR: #008080">37</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">38</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">39</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />decorator::~decorator()<br /></span> <span style="COLOR: #008080">40</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">41</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">42</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">43</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">44</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> headdeco::headdeco(component </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> refcom, </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> i):<br /></span> <span style="COLOR: #008080">45</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />  decorator(refcom)<br /></span> <span style="COLOR: #008080">46</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> ,_i_head(i)<br /></span> <span style="COLOR: #008080">47</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">48</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">49</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">50</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />void headdeco::printsefl() <br /></span> <span style="COLOR: #008080">51</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{ <br /></span> <span style="COLOR: #008080">52</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   printhead();<br /></span> <span style="COLOR: #008080">53</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   decorator::printsefl();<br /></span> <span style="COLOR: #008080">54</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   <br /></span> <span style="COLOR: #008080">55</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">56</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />void headdeco::printhead() <br /></span> <span style="COLOR: #008080">57</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">58</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">endl;<br /></span> <span style="COLOR: #008080">59</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">_i_head;<br /></span> <span style="COLOR: #008080">60</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">endl;<br /></span> <span style="COLOR: #008080">61</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">62</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />headdeco::~headdeco()<br /></span> <span style="COLOR: #008080">63</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">64</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /></span> <span style="COLOR: #008080">65</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">66</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">67</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />enddeco::enddeco(component </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> refcom,char </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> pch)<br /></span> <span style="COLOR: #008080">68</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />:decorator(refcom)<br /></span> <span style="COLOR: #008080">69</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />,_pch_end(pch)<br /></span> <span style="COLOR: #008080">70</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">71</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />   <br /></span> <span style="COLOR: #008080">72</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">73</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />void enddeco::printsefl() <br /></span> <span style="COLOR: #008080">74</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">75</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    decorator::printsefl();<br /></span> <span style="COLOR: #008080">76</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    printend();<br /></span> <span style="COLOR: #008080">77</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">78</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />void enddeco::printend()  <br /></span> <span style="COLOR: #008080">79</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">80</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">endl;<br /></span> <span style="COLOR: #008080">81</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">_pch_end;<br /></span> <span style="COLOR: #008080">82</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">endl;<br /></span> <span style="COLOR: #008080">83</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">84</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />enddeco::~enddeco()<br /></span> <span style="COLOR: #008080">85</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">86</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">87</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}</span> </div> <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"> <span style="COLOR: #008080"> 1</span> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">//</span> <span style="COLOR: #000000"> decorator.cpp : 定义控制台应用程序的入口炏V?br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #000000">//</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">stdafx.h</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">iostream</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">component.h</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />using namespace std;<br /></span> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> void printmodel(component</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> pcom )<br /></span> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">11</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    pcom.printsefl();<br /></span> <span style="COLOR: #008080">12</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> _tmain(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> argc, _TCHAR</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> argv[])<br /></span> <span style="COLOR: #008080">14</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span> <span style="COLOR: #008080">15</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />     <br /></span> <span style="COLOR: #008080">16</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    printmodel(headdeco(headdeco(enddeco(concreatecom(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">正文输出中。。。?/span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">),</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">黄大?/span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">),</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">),</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">));<br /></span> <span style="COLOR: #008080">17</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    return </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">18</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span> <span style="COLOR: #008080">19</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <p> <br /> <br />       q个decorator 模式例子让初学?更能加深 多态威力的体会?decorator 模式 比子cȝzȝ体会<br />要注意的问题是:对象链L?concreatecomponent  对象处结束?br /><br />  ///此处是client 使用 对象的入口点Q仅仅得C 1?decorator 的派生类对象Qclient 什么都不知?br />printmodel(headdeco(headdeco(enddeco(concreatecom("正文输出中。。。?),"黄大?),2),1));<br />///<br /></p> <p>     在vc2005 下通过<br /></p> <img src ="http://www.shnenglu.com/bloodsuck/aggbug/20338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2007-03-22 09:56 <a href="http://www.shnenglu.com/bloodsuck/archive/2007/03/22/20338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL container http://www.shnenglu.com/bloodsuck/archive/2006/09/18/12667.html黄大?/dc:creator>黄大?/author>Mon, 18 Sep 2006 02:43:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/09/18/12667.htmlhttp://www.shnenglu.com/bloodsuck/comments/12667.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/09/18/12667.html#Feedback0http://www.shnenglu.com/bloodsuck/comments/commentRss/12667.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/12667.htmlContainers in STL can be divided into three categories:
1.sequence containers,
2.associative containers,
3.container adapters.

1.Sequence Containers

Sequence containers maintain the original ordering of inserted elements. This allows you to specify where to insert the element in the container.

The deque (double-ended queue) container allows for fast insertions and deletions at the beginning and end of the container. You can also randomly access any element quickly.

The list container allows for fast insertions and deletions anywhere in the container, but you cannot randomly access an element in the container.

The vector container behaves like an array, but will automatically grow as required.

For more information on the sequence containers, consult the following table:

Sequence Container Native STL

deque

deque Class

ilist

Not Applicable

list

list Class

vector

vector Class

2.Associative Containers

The defining characteristic of associative containers is that elements are inserted in a pre-defined order, such as sorted ascending.

The associative containers can be grouped into two subsets: maps and sets. A map, sometimes referred to as a dictionary, consists of a key/value pair. The key is used to order the sequence, and the value is somehow associated with that key. For example, a map might contain keys representing every unique word in a text and values representing the number of times that word appears in the text. A set is simply an ascending container of unique elements.

Both map and set only allow one instance of a key or element to be inserted into the container. If multiple instances of elements are required, use multimap or multiset.

Both maps and sets support bidirectional iterators. For more information on iterators, see Iterators.

While not officially part of the STL standard, hash_map and hash_set are commonly used to improve searching times. These containers store their elements as a hash table, with each table entry containing a bidirectional linked list of elements. To ensure the fastest search times, make sure that the hashing algorithm for your elements returns evenly distributed hash values.

For more information on the associative containers, consult the following table:

Associative Container Native STL

hash_map

hash_map Class

hash_multimap

hash_multimap Class

hash_multiset

hash_multiset Class

hash_set

hash_set Class

map

map Class

multimap

multimap Class

multiset

multiset Class

set

set Class



3.Container Adapters

The container adapters are simply variations of the above containers. The container adapters do not support iterators.

The priority_queue container organized such that the element with the highest value is always first in the queue.

The queue container follows FIFO (first in, first out) semantics. The first element inserted (pushed) into the queue is the first to be removed (popped).

The stack container follows LIFO (last in, first out) semantics. The last element to be inserted (pushed) on the stack is the first element to be removed (popped).

Since container adapters do not support iterators, they cannot be used with the STL algorithms. For more information on algorithms, see Algorithms.

For more information on the container adapters, consult the following table:

Container Adapter Native STL

priority_queue

priority_queue Class

queue

queue Class

stack

stack Class




Requirements for Container Elements

Elements inserted into an STL container can be of any object type that supplies a public copy constructor, a public 
                                      public 拯构?Qpublic 析构 ,public 赋值操作符   elem& operator =( elem const &)
destructor, and a public assignment operator. The destructor may not throw an exception. Furthermore, associative 
                                                                       析构不能抛出异常
containers such as set and map must have a public comparison operator defined, which is operator< by default. Some 
                             兌容器  除此?q应由有 比较操作W?br />                  operations on containers might also require a public default constructor and a public equivalence operator.




以下是?各容?q代器类型输Z?br />

 1#include <vector>
 2#include <list>
 3#include <deque>
 4#include <set>
 5#include <map>
 6using namespace std;
 7template <typename inputitrator >
 8void predict(inputitrator  a)
 9{   iterator_traits<inputitrator>::iterato_category  b;
10   
11   cout<< endl<< "  "<<typeid(b).name();
12}

13
14
15main()
16
17{
18  vector<int> a;
19  deque<int> b;
20  list<int> c;
21  set<int> d;
22  map<int> e;
23  
24   predict(a.begin());
25   predict(b.begin());
26   predict(c.begin());
27    predict(d.begin());
28     predict(e.begin());
29
30}
output iterator
   -> forward iterator
   -> bidirectional iterator
   -> random-access iterator

input iterator
   -> forward iterator
   -> bidirectional iterator
   -> random-access iterator


]]>
MFC ?命o消息传?Q原创)http://www.shnenglu.com/bloodsuck/archive/2006/07/27/10575.html黄大?/dc:creator>黄大?/author>Thu, 27 Jul 2006 03:27:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/07/27/10575.htmlhttp://www.shnenglu.com/bloodsuck/comments/10575.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/07/27/10575.html#Feedback2http://www.shnenglu.com/bloodsuck/comments/commentRss/10575.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/10575.html      CCmdTarget ?模板 Q提供: CCmdTarget::OnCmdMsg() q个函数 ?其派生类 的消息结构数l(它是静态的Q做搜烦 q向上(基类Q的l构数组做搜索ƈ调用相应的成员函数?br />   zcM?
 DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(本类, 基类)
 ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
END_MESSAGE_MAP()
加入链表

        AfxWndProc Q只有发向窗口才会被调用Q,此函?用HWND ?mfc库的全局变量?br />扑ֈ句柄映射表,转ؓ CWnd ?Q最l?zcȝ对OnCmdMsg()的重?来实?不同的\?br />
     以上原理
           做ؓ一个例子,给ZCZQ?br />
 1class CMan : public CCmdTarget
 2{
 3    DECLARE_DYNAMIC(CMan)
 4
 5public:
 6    CMan();
 7    virtual ~CMan();
 8
 9protected:
10    DECLARE_MESSAGE_MAP()
11public:
12    afx_msg void OnAppAbout();
13    virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
14    int m_id;
15    CString m_name;
16}
;////////////自定义的c++c?br />17
18
19////////////////重蝲 onCmdMsgQ(m_man为CMainFram的成员)

20BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
21{
22    // TODO: 在此d专用代码?或调用基c?/span>
23          if (m_man.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo ))
24          {
25              return true;
26
27          }
else
28    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
29}

30//////////////lCMan 加个命o响应
31BEGIN_MESSAGE_MAP(CMan, CCmdTarget)
32    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
33END_MESSAGE_MAP()
34
35
36
37// CMan 消息处理E序
38
39void CMan::OnAppAbout()
40{
41    // TODO: 在此d命o处理E序代码
42    CString str;
43    str.Format("%d ",m_id);
44    str+=m_name;
45    AfxMessageBox(str);
46}

47///////////
48
49q行后就会发玊W此命o由CMan::onAppAbout() 来?br />50响应


]]>
聚合http://www.shnenglu.com/bloodsuck/archive/2006/07/05/9422.html黄大?/dc:creator>黄大?/author>Wed, 05 Jul 2006 03:45:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/07/05/9422.htmlhttp://www.shnenglu.com/bloodsuck/comments/9422.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/07/05/9422.html#Feedback0http://www.shnenglu.com/bloodsuck/comments/commentRss/9422.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/9422.html      a 聚合 b
    b 要有必要的支持才能实玎ͼ具体q程如:
     a, cocreateinstance,指定 自己的IUnknown  ,q必diid,ppv中指定是 IID__IUnknown ,IUnknown*Q被聚合的comcȝ 非委托IUnknownQ?br />此时 被聚合类 在类厂(createinstance ?接收 a?IUnknown  q在 b 的成员中赋好|支持下,被创?br />的comc?被创建?br />      b ?2l?IUnknown 接口Q委托(聚合Q?和 ?非委托(正常Q?br />    在a 中获?IUnknown接口Qb的)Q请?其他 接口?( a?客户发出的对b 的接口请?转到  a 获取
 IUnknown 接口 调用 queryinterface ),全部使用  b 对象 的?委托接口  来判断?是把接口h 转到
非委?q是 外部  a 的IUnknown


]]>
一个包定w?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/07/04/9383.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Tue, 04 Jul 2006 08:20:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/07/04/9383.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/9383.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/07/04/9383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/9383.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/9383.html</trackback:ping><description><![CDATA[     摘要: 1 #pragma once   2 static   const  GUID CLSID_mydiv  =     3 {  ...  <a href='http://www.shnenglu.com/bloodsuck/archive/2006/07/04/9383.html'>阅读全文</a><img src ="http://www.shnenglu.com/bloodsuck/aggbug/9383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-07-04 16:20 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/07/04/9383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Run time type Informationhttp://www.shnenglu.com/bloodsuck/archive/2006/07/04/9360.html黄大?/dc:creator>黄大?/author>Tue, 04 Jul 2006 02:23:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/07/04/9360.htmlhttp://www.shnenglu.com/bloodsuck/comments/9360.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/07/04/9360.html#Feedback2http://www.shnenglu.com/bloodsuck/comments/commentRss/9360.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/9360.html
一                 dynamic_cast
< type-id > ( expression )
  type-id :必须是指针或者引?br />  expression:必须是指针或者一个左?br />基本上是用来?子对象间的{?br />1.基本的用?br />
class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
   C* pc = dynamic_cast<C*>(pd);   // ok: C is a direct base class
                                 // pc points to C subobject of pd 

   B* pb = dynamic_cast<B*>(pd);   // ok: B is an indirect base class
                                 // pb points to B subobject of pd 
   ...
}

This type of conversion is called an "upcast" because it moves a pointer up a class hierarchy, from a derived class to a class it is derived from. An upcast is an implicit conversion.

If type-id is void*, a run-time check is made to determine the actual type of expression. The result is a pointer to the complete object pointed to by expression. For example:

class A { ... };

class B { ... };

void f()
{
   A* pa = new A;
   B* pb = new B;
   void* pv = dynamic_cast<void*>(pa);
   // pv now points to an object of type A
   ...
   pv = dynamic_cast<void*>(pb);
   // pv now points to an object of type B
}

If type-id is not void*, a run-time check is made to see if the object pointed to by expression can be converted to the type pointed to by type-id.

If the type of expression is a base class of the type of type-id, a run-time check is made to see if expression actually points to a complete object of the type of type-id. If this is true, the result is a pointer to a complete object of the type of type-id. For example:

class B { ... };
class D : public B { ... };

void f()
{
   B* pb = new D;                     // unclear but ok
   B* pb2 = new B;

   D* pd = dynamic_cast<D*>(pb);      // ok: pb actually points to a D
   ...
   D* pd2 = dynamic_cast<D*>(pb2);   // pb2 points to a B not a D
                                    // cast was bad so pd2 == NULL
   ...
}

This type of conversion is called a "downcast" because it moves a pointer down a class hierarchy, from a given class to a class derived from it.
结Q?br />  a     实际指向对象 和 ?b 目标对象,  b 是a ?基类Q子对象Q,或者是2?同转换才成?br />否则 目标为NULL;也就是说不能向下?br />


2   多重非虚的承模?br />

Class Hierarchy Showing Multiple Inheritance

A pointer to an object of type D can be safely cast to B or C. However, if D is cast to point to an A object, which instance of A would result? This would result in an ambiguous casting error. To get around this problem, you can perform two unambiguous casts. For example:

void f()
{
   D* pd = new D;
   A* pa = dynamic_cast<A*>(pd);      // error: ambiguous
   B* pb = dynamic_cast<B*>(pd);      // first cast to B
   A* pa2 = dynamic_cast<A*>(pb);   // ok: unambiguous
}

Further ambiguities can be introduced when you use virtual base classes. Consider the class hierarchy shown in the following figure.

    也就是说?意性下会失?br />3.子对象间的{?br />

Class Hierarchy Showing Duplicate Base Classes


    //pd 指向 e 对象
void f(D* pd)
{
   E* pe = dynamic_cast<E*>(pd);
   B* pb = pe;      // upcast, implicit conversion
   A* pa = pb;      // upcast, implicit conversion
}

//pd 指向 e 对象
void f(D* pd)
{
   B* pb = dynamic_cast<B*>(pd);      // cross cast
   A* pa = pb;                  // upcast, implicit conversion
}

  也就是?所?cross cast

二?typeid( type-id )     typeid( expression ) 
   此操作符q回个?const type_info & 
            expression 必须指向一个多态类型(带虚函数    Q,q且要解引用

#include <iostream>
#include <typeinfo.h>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main()
{
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}
// compile with: /GR /EHsc

在模版中使用
template < typename T > T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}


           



]]>
一个comlg的练?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/06/30/9244.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Fri, 30 Jun 2006 09:23:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/06/30/9244.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/9244.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/06/30/9244.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/9244.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/9244.html</trackback:ping><description><![CDATA[     摘要: //  {7B55D765-68A6-404e-99E2-CA9ABC389A27} static   const   GUID IID_IUnknown9 =   {  0x7b55d765 ...  <a href='http://www.shnenglu.com/bloodsuck/archive/2006/06/30/9244.html'>阅读全文</a><img src ="http://www.shnenglu.com/bloodsuck/aggbug/9244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-06-30 17:23 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/06/30/9244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC?windows object ?C++ objecthttp://www.shnenglu.com/bloodsuck/archive/2006/06/30/9222.html黄大?/dc:creator>黄大?/author>Fri, 30 Jun 2006 03:33:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/06/30/9222.htmlhttp://www.shnenglu.com/bloodsuck/comments/9222.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/06/30/9222.html#Feedback1http://www.shnenglu.com/bloodsuck/comments/commentRss/9222.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/9222.html The Problem

Windows objects are normally represented by HANDLEs. The MFC classes wrap Windows object handles with C++ objects. The handle wrapping functions of the MFC class library provide a way to find the C++ object that is wrapping the Windows object with a particular handle. There are times when a Windows object does not have a C++ wrapper object, however, and at these times a temporary object is created to act as the C++ wrapper.

mfc 映射?windows object ---->c++ wrapper
以下使用 mfc 的函?如:fromhandle, getdlgitem,都会q回temporary ?pemanent  c++ wrapper object
 注意Q?br />     零时?对象 会被在空闲时(OnIdle()函数)被删除,不能存下在下ơ消息处理中 使用
The default OnIdle processing in CWinThread automatically calls DeleteTempMap for each class that supports temporary handle maps
////////////////////////////////////////////////////////////
The Windows objects that use handle maps are:

  • HWND (CWnd and CWnd-derived classes)
  • HDC (CDC and CDC-derived classes)
  • HMENU (CMenu)
  • HPEN (CGdiObject)
  • HBRUSH (CGdiObject)
  • HFONT (CGdiObject)
  • HBITMAP (CGdiObject)
  • HPALETTE (CGdiObject)
  • HRGN (CGdiObject)
  • HIMAGELIST (CImageList)
  • SOCKET (CSocket)

///////////////////////////////////////////////

Given a handle to any of these objects, you can find the MFC object that wraps the handle by calling the static member function FromHandle. For example, given an HWND called hWnd:

CWnd::FromHandle(hWnd)

will return a pointer to the CWnd that wraps the hWnd. If that hWnd does not have a specific wrapper object, then a temporary CWnd is created to wrap the hWnd. This makes it possible to get a valid C++ object from any handle.

Once you have a wrapper object, you can get to its handle through a public member variable. In the case of a CWnd, m_hWnd contains the HWND for that object.

Attaching Handles to MFC Objects

Given a newly created handle-wrapper object and a handle to a Windows object, you can associate the two by calling Attach. For example:

CWnd myWnd;
myWnd.Attach(hWnd);
////mywnd 析构时会调用 destroywindow ,q同 hwnd 一起销?br />



This makes an entry in the permanent map associating myWnd and hWnd.
Calling CWnd::FromHandle(hWnd) will now return a pointer to myWnd.
When myWnd is deleted, the destructor will automatically destroy the hWnd by calling the Windows DestroyWindow function. If this is not desired, the hWnd must be detached from myWnd before the myWnd object is destroyed (normally when leaving the scope at which myWnd was defined). The Detach member function does this.

myWnd.Detach();

More About Temporary Objects

Temporary objects are created whenever FromHandle is given a handle that does not already have a wrapper object. These temporary objects are detached from their handle and deleted by the DeleteTempMap functions. The default OnIdle processing in CWinThread automatically calls DeleteTempMap for each class that supports temporary handle maps. This means that you cannot assume a pointer to a temporary object will be valid past the point of exit from the function where the pointer was obtained, as the temporary object will be deleted during the Windows message-loop idle time.

很重?
在多U程中传?c++ wrapper object 是无效的(无论?temporary q是 permanent)
只能传?windows handle, 换句话就是说Q?U程 只能 讉K 自己创徏的c++ wrapper object

Wrapper Objects and Multiple Threads

Both temporary and permanent objects are maintained on a per-thread basis. That is, one thread cannot access another threads C++ wrapper objects, regardless of whether it is temporary or permanent. As stated above, temporary objects are deleted when the thread which that temporary object belongs enters OnIdle.

To pass these objects from one thread to another, always send them as their native HANDLE type. Passing a C++ wrapper object from one thread to another will often result in unexpected results.

    



]]>
STL 乱学二(原创Q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/06/02/8084.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Fri, 02 Jun 2006 07:43:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/06/02/8084.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/8084.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/06/02/8084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/8084.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/8084.html</trackback:ping><description><![CDATA[1.容器<br />   序: vector(cM动态增长数l)  deque Q双端队列)  listQ双头指针)<br />   兌:set  multiset(有重复)  map   multisetQ有重复Q?Q自动排序(内部2叉树Q?br />  Ҏ预定义容器:stack, queue ,prority queue<br />2.q代?br />      每种容器都提供了自己的P代器Q相同的操作界面Q不同的内部实现Q?br />   *,->,==,!=,++,--共同操作<br />     随机iterator : 支持 >Q?lt;:如:vector, deque,string<br />    双向iterator:不支?gt;,<:<br />   Ҏ预定义:<br />插入q代?br />          insert iterator:引v自动增长Q非覆盖<br />             back_inserter(container)<br />             front_inserter(container)<br />           inserter(container,pos)//调用 container.insert()//每种容器都具有insert()//兌容器唯一<br /> P代器<br />             istream_iterator<br />             ostream_iterator<br /> 逆向q代?br />容器中元素应满Q?br />     有拷贝构造,赋D符Q析构能销?br />   序Q默认构造应该可?br />   兌Q必L排序准则<br />容器中是 g是引?br /><br />通用操作Q?br />   containertype c;<br />  ct  c(c1);<br />  ct   c(begin,end);<br /> c.~ct();<br /> c.size(), c.max_size(),c.empty(),c1==c2;c1<c2;c1.swap(c2); swap(c1,c2);c.begin();c.end();c.rbegin();c.rend();<br />c.inert(pos,elem);c.erase(begin,end),c.clear(),c.get_allocator<br /> <br />     3.vector <br />    动态增长数l?在队插入,删除效率?br />注意 动态增长时 q代器失?内部可能要重配置<br />除了clear(),vector 不会自动~小<br />vector 的P代器 是 元素的native指针,q箋存储QP代器是个random <br />I判?br />       a.begin==a.end<br /><br />4.list <br />   q代器是个双向的Q非q箋存储Q而且是个环状链表在尾端是个未初始化节?br />I判?br />   a.begin==a.end;<br />clear  remove  unique(把相同元素移出,留一?  insert<br />只能使用成员函数 sortQ不能用 算?sort(他只接受random iterator)<br />5 .deque<br />动态增长的双端队列 Q但内部机制和vector 不一?Q若q连l存储的集合<br />法复杂度高Q如排序时可?其复制到 vector中,?插?删除效率高?Q?br />提供随机q代?br />6.stack (container adapter)<br />先进后出Q不供P代器Q?不提供走访功?br />7.queue(container adapter)<br />  先进先出Q不提供q代器,不提供走访功?br />8.heap 辅助<br />   其内部ؓ一个完?叉树Q插入时自动排序Q一般ؓmax_heap<br />   左右无序Q某节点 i, 父节点 i/2,左子节点 2iQ右子节?2i+1Q?br /> <pre class="syntax"><b>template<class RandomAccessIterator> inline</b><b> void make_heap(</b><b> RandomAccessIterator </b><i>First</i><b>,</b><b> RandomAccessIterator </b><i>Last</i><b> )</b><b>template<class RandomAccessIterator> inline</b><b> void sort_heap(</b><b> RandomAccessIterator </b><i>First</i><b>,</b><b> RandomAccessIterator </b><i>Last</i><b> )</b><b>template<class RandomAccessIterator> inline</b><b> void push_heap(</b><b> RandomAccessIterator </b><i>First</i><b>,</b><b> RandomAccessIterator </b><i>Last</i><b> )</b><b>template<class RandomAccessIterator> inline</b><b> void pop_heap(</b><b> RandomAccessIterator </b><i>First</i><b>,</b><b> RandomAccessIterator </b><i>Last</i><b> )</b></pre>         <br />             9.set,兌容器 Q底层以rb-tree 实现Q其q代器ؓ个const iterator<br />   不能用P代器来改?元素|~省下以递增排序<img src ="http://www.shnenglu.com/bloodsuck/aggbug/8084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-06-02 15:43 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/06/02/8084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL 乱学一Q原创)http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7950.html黄大?/dc:creator>黄大?/author>Wed, 31 May 2006 08:53:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/05/31/7950.htmlhttp://www.shnenglu.com/bloodsuck/comments/7950.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/05/31/7950.html#Feedback0http://www.shnenglu.com/bloodsuck/comments/commentRss/7950.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/7950.html阅读全文

]]>
国内哪家哪家银行的羃写最?!!!!!!!!!!!!!!!!!! http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7937.html黄大?/dc:creator>黄大?/author>Wed, 31 May 2006 06:50:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/05/31/7937.htmlhttp://www.shnenglu.com/bloodsuck/comments/7937.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/05/31/7937.html#Feedback0http://www.shnenglu.com/bloodsuck/comments/commentRss/7937.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/7937.html
1.中国银行――CBCQConstruction Bank of ChinaQ?――“存不存Q?
2.中国银行――BCQBank of ChinaQ?――“不存!?
3.中国农业银行――ABCQAgriculture Bank of ChinaQ?――“啊Q不存。?
4.中国工商银行――ICBC ―?“爱存不存。?
5.民生银行――CMSB ――“存吗?SB?
6.招商银行――CMBC ――“存吗?Q白 _?
7. 兴业银行――CIB ――“存一䏀?
8. 国家开发银行――CDB ――存点吧Q?
9.?北京市商业银行――BCCB ――白存存不??
10.汇丰银行――HSBC ――“还是不存。?
 


]]>
C++书籍下(转蝲Q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7936.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Wed, 31 May 2006 05:36:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7936.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/7936.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7936.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/7936.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/7936.html</trackback:ping><description><![CDATA[ <font face="Verdana"> 我在上篇中“盘点”了TCPL和D&E以及入门教程、高效和健壮~程、模板和泛型~程{方面共十几本C++好书。冬L来,让我们lC++书籍_ֽ之旅J  </font> <p> <font face="Verdana">标准库?</font> </p> <p> <font face="Verdana">当我q在研究院工作时Q与同院另外两家研究所合作开发过一个大型水利枢U调度集成项目。我们三家Y件系l之间都要相互通信。在调试通讯模块Ӟl心的客P一名好学的pȝ理员)发现对于同一通信规约的解释代码,我的不超q?0行,而对方的则超q了150行且很难看懂。这位系l管理员很纳P我说大家~程风格和习惯不一P我用了标准库,而他使用了传lC~程风格以及他所习惯的另外一些技术。?</font> </p> <p> <font face="Verdana">别误会!我绝无贬低这位合作伙伴的意思。事实上Q我寚w些真正有着深厚的C~程功力的程序员常常怀有钦佩之心。毕竟,C++能有今天的成功在很大E度上缘于它深深地植根于C。作Z名C++E序员,倘若不熟悉C++中的CQ我往往会认Z的基本功是不扎实的,他的技术底气是不的。?</font> </p> <p> <font face="Verdana">不过话又说回来,C++是一U多范型QparadigmQ编E语aQ具体采用哪U编E风|专业E序员应该知道视具体情况而定。作Z名经帔R要在现场做即兴开发的目负责人,Z短^快地解决当务之急,我习惯尽量采用现有的库(和组Ӟ。效率(以及强健性)久经验证的C++标准库已l摆在那儿了Q何乐而不用呢Q?</font> </p> <p> <font face="Verdana">Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference <br />《C++标准E序库:自修教程与参考手册》,华中U技大学出版C?</font> </p> <p> <font face="Verdana">q是一本百U全书式的C++标准库著作,是一本需要一再查阅的参考大全。它在完备性、细致性以及精性方面都是无与u比的。本书详l介l了每一标准库组件的规格和用法,内容늛包括和本地化在内的整个标准库而不仅仅是STL。正如本书副标题所C,它首先适合作ؓ教程阅读Q尔后又可用作参考手册?</font> </p> <p> <font face="Verdana">显易懂的写作风g得这本书非常易读。如果你希望学习标准库的用法q尽可能地发挥其潜能Q那你必L有这本书。正如网l上所aQ这本书不仅仅应该摆在你的书׃Q更应该攑ֈ你的电脑桌上。我向每一位职业C++E序员强烈推荐?</font> </p> <p> <font face="Verdana">Angelika Langer, Klaus Kreft, Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference <br />《标准C++输入输出与本地化》,人民邮电出版C?</font> </p> <p> <font face="Verdana">C++标准库由STL、流和本地化三部分构成。关于STL的书市面上已l有不少Q但|见和本地化方面的专著。本书是q两个领域中最优秀的一本,q今为止没有M一本书比这一本更全面详尽地讨Z和本地化。如果你不满于停留在“会用”流库的层面Q千万不要错q它?</font> </p> <p> <font face="Verdana">2001q夏天,我草草翻阅过q本书的中文版,从内容到包装都给我留下了比较深刻的印??不过负面的居多一些?003q秋天,无意中得知某|络书店正以低h甩卖q本书的中译本,情不自禁Q一阵唏嘘?</font> </p> <p> <font face="Verdana">Scott Meyers, Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library <br />《Effective STLQ媄印版Q》,中国电力出版C?</font> </p> <p> <font face="Verdana">dScott 的《Effective C++》和《More Effective C++》的中译本之后,我一直期待这本书的中文版。我从潘爱民先生的个Z上了解刎ͼ他和他的合作伙伴g早已完成了这本书的翻译工作,可惜至今市面上仍不得见。幸q的是,我们可以看到它的原版?</font> </p> <p> <font face="Verdana">本书是用STL的程序员必读之作。在q本书中QScott向我们讲qSTL容器和算法的工作机制以及如何以最x式用它们。和Scott的其他作品一Pq本书的写作风格清晰、精,h极佳的可L。看q这本书以后Q我想你也许会和我以及其他C++E序员一样生这LxQScott什么时候会写出一本“More Effective STL”? </font> </p> <p> <font face="Verdana">关于STLQ我q提醒你留心Matthew H. Austern的《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》(《泛型编E与STL》,中国电力出版C)。这本书散发着厚的学院气息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一书末N重推荐另外两本进阶好书(除了他们自己的《Ruminations on C++》外Q,其中一本是TCPLQ另外一本就是本书! </font> </p> <p> <font face="Verdana">|络~程 </font> </p> <p> <font face="Verdana">在网l编E时代,C++应该扮演着怎样的角Ԍ让ACEQAdaptive Communications EnvironmentQ来告诉你?</font> </p> <p> <font face="Verdana">Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns <br />Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks <br />《C++|络~程Q卷1Q运用ACE和模式消除复杂性》,华中U技大学出版C?<br />《C++|络~程Q卷2Q基?ACE 和框架的pȝ化复用》,电子工业出版C?</font> </p> <p> <font face="Verdana">采用C++q行企业U网l编E,目前ACEQ以及这两本书)是一个值得考虑的选择。ACE是一个面向对象、跨q_、开放源码的|络~程框架Q目标在于构建高性能|络应用和中间g。Douglas是ACE的创始hQStephen则已为ACE提供了数q的技术支持和N服务Q两位都是ACECQ是的,ACE的媄响和实际应用的程度已lŞ成了一个社)的专家?</font> </p> <p> <font face="Verdana">ACEq不单单被大学和研究所q捧Q它已经被成功地应用于世界上成千上万个商业应用中。在电信、宇航、医药和财经领域的网l系l中QACE已经ql发挥着重要的作用。如果你准备开发高性能通讯pȝQ你应该考虑考虑q一汇集世界尖专家智慧的成果?</font> </p> <p> <font face="Verdana">除了使用C++面向对象设计技术和模板{高U语aҎ外QACEq运用了大量的模式。《C++|络~程》卷1和卷2q不仅仅教你关于ACE的方斚w面,它还会教l你模式和通用框架设计{高U技术等。所以,作ؓ一名中、高UC++E序员,即你很进行正儿八l的C++|络E序设计Q阅读这两本书同样可以从中受益?</font> </p> <p> <font face="Verdana">是的Qƈ非所有网l应用都要用Web服务器(以及其他应用服务器)和重量lg模型Q换个思\Q它们或怹可以从轻量的ACElg中获益?</font> </p> <p> <font face="Verdana">杂项 </font> </p> <p> <font face="Verdana">以下q几本书之所以被列入“杂”单元,只是因ؓ我没有考虑出更合适的归类ҎQ它们和上面的书c一P值得一诅R?</font> </p> <p> <font face="Verdana">Bruce Eckel, Thinking in C++, Volume 1: Introduction to Standard C++ (2nd Edition) <br />Bruce Eckel, Thinking in C++, Volume 2: Practical Programming (Second Edition) <br />《C++~程思想Q第2版)W?P标准C++导引》,机械工业出版C?<br />《C++~程思想Q英文版 W?版)》,机械工业出版C?</font> </p> <p> <font face="Verdana">《Thinking in C++》的W?版于1996q荣获“Y件研发”杂志评选的图书震撼大奖。最新推出的W?版对内容q行了大q改写和调整Q以反映C++标准化带来的影响以及q几q面向对象领域最新研I和实践成果。“输入输入流”、“多重扎쀝、“异常处理”和“运行时cd识别”等高主题q同C++标准化以后增加的一些内容则被放入第二卷中。Bruce是一名经验丰富的C++讲师和顾问,其培训和写作l验都是世界一水准,他的作品比那些“玩”的技术h员写的东西更能吸引读者。事实上Q在同类图书中,对于大多数读者而言Q这本书的可L要过TCPL和《C++ Primer》。顺带一提,讉K作者的站点Q你可以先睹W二L风采?</font> </p> <p> <font face="Verdana">Andrew Koenig, Barbara E. Moo, Ruminations on C++: A Decade of Programming Insight and Experience <br />《C++沉思录》,人民邮电出版C?</font> </p> <p> <font face="Verdana">Andrew是世界上屈指可数的C++专家。这是一本关于C++~程思想和程序设计技术而非语言l节的著作。如果你已经h一定的基础Q这本书教你在q行C++~程时应该怎样思考,应该如何表达解决Ҏ。整本书技术表N彻Q文字通俗易懂。Bjarneq样评hq本书:本书遍布“C++是什么、C++能够做什么”的真知D?</font> </p> <p> <font face="Verdana">Stanley B. Lippman, Inside The C++ Object Model <br />《深度探索C++对象模型》,华中U技大学出版C?<br />《深度探索C++对象模型Q媄印版Q》,中国电力出版C?</font> </p> <p> <font face="Verdana">从编译器的角度观察C++可以使你知其然ƈ知其所以然。本书探讨了大量的C++面向对象E序设计的底层运作机Ӟ包括构造函数、函数、时对象、ѝ虚拟、模板的实例化、异常处理、运行期cd识别{,另外q介l了一些在实现C++对象模型q程中做出的权衡折衷。喜Ƣ刨栚w底的C++E序员不要错q这本书?</font> </p> <p> <font face="Verdana">Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented software <br />《设计模式:可复用面向对象Y件的基础》,机械工业出版C?<br />《设计模式:可复用面向对象Y件的基础Q英文版Q》,机械工业出版C?</font> </p> <p> <font face="Verdana">设计可复用的面向对象的YӞ你需要掌握设计模式。本书ƈ非专为C++E序员而写Q但它采用了C++Q以及SmalltalkQ作Z要示例语aQC++E序员尤其易于从中受益。四位作者都是国际公认的面向对象软g领域专家Q他们将面向对象软g的设计经验作计模式详l记录下来。这本书影响是如此深q,以至于四位作者以及本书都被昵UCؓGoFQGang of FourQ。本书学院气息浓厚,行文风格严}z,虽然它不如某些讲解模式的书籍易读Q但真正要精准地理解设计模式Q本书是l极权威。学习设计模式,q本书需要一而再、再而三的咀嚹{顺带一句:请将设计模式化作开拓思维的钥匙,切莫成ؓ闭思维的枷锁?</font> </p> <p> <font face="Verdana">q有一些C++好书值得一读,恕此处无法一一列出。例如John Lakos的著作《Large-Scale C++ Software Design》(《大规模C++E序设计》,中国电力出版C)和侯捷先生的《STL 源码剖析》(华中U技大学出版C){?</font> </p> <p> <font face="Verdana">《STL 源码剖析》是一本很有特色的书,但我认ؓ它还可以更好。我个h期待侯捷先生自第一版发行以来经q对模板技术的沉淀和再思考之后,再写一本剖析得更深入、更透彻q且更全面的“第二版”。遗憄是,侯捷先生在完成《C++ Templates: The Complete Guide》一书的译后似乎决定暂时告别模ѝ泛型编E和STL领域?</font> </p> <p> <font face="Verdana">2004q??1日补充:我目前最常查阅的两本参考书是《C++标准E序库》和《STL源码剖析》。当然了Q这与我q内的写作计划有很大的关pR?</font> </p> <p> <font face="Verdana">使用C++成功开发大规模软gpȝQ不仅需要很好地理解大多数C++书籍中讲q的逻辑设计问题Q更需要掌握《大规模C++E序设计》中讲述的物理设计技术。当Ӟq本书的有点过时了Q不q,如果你的_֊和金钱都比较宽ԒQ买一本看看ƈ无坏处?</font> </p> <p> <font face="Verdana">xQ我x必要声明一下,有一些(好)书没有得到推荐,主要原因如下Q?</font> </p> <p> <font face="Verdana">    * 以上q些书已l够多、够好了?<br />    * 我不会推荐通过正常渠道很难购买到的书籍 ?不管是中文版q是英文版?<br />    * 作(译)者名气大不影响我的推荐。我们是在看书,不是看h?<br />    * 我不会推荐我从来没有看过的书。我臛_要看q其中的某个版本Q包括电子档Q。这个“看”,一般指“认真阅诠Z,不过有一些也只能是“浏览”?</font> </p> <p> <font face="Verdana">l语 </font> </p> <p> <font face="Verdana">作ؓ一名普通技术写译者,我深知技术创作和译的艰辛(和快乐)Qƈ多多少了解一些有x术书c创作、翻译、制作、出版以及市场推介背后的l节。今天,我不会再对一本看上去差强人意的图书信口开沟뀂罗列同一本书的各U版本的用意只在于ؓ你多提供一些信息,让你多一U选择?</font> </p> <p> <font face="Verdana">在本文成文的后期Q我lBjarne写了一信Q请教如果他来写q篇文章会怎么写。他l了我简明扼要的。在肯定以上列出的绝大部分图书都是世界顶水q的C++著作的同ӞBjarne提醒我别忘了向专家E序员推荐《The C++ Standard : Incorporating Technical Corrigendum No. 1》。这本书?C++标准规范的“图书版”,Bjarne亲自Z作序?</font> </p> <p> <font face="Verdana">Bjarneq友好地提醒我,在我的推荐列表中没有哪一本有助于C++E序员进行Windows~程 ?q正是我的本意。在q篇文章中,我只推荐、点评^C立的C++著作Q网l编E除外) ?和操作系l无养I和集成开发环境无养I我甚臛_惛_们和~译器也无关。你可以Ҏ业务开发需要,选读自己喜爱的领域相关的C++书籍?</font> </p> <p> <font face="Verdana">说到“系l无兟뀁^C立”,我不由得惌v了“抽象层”的概念。开发实际应用的C++E序员通常工作于特定操作系l、特定开发环境和特定业务领域之中Q而对标准C++和C++标准库扎实而深ȝ把握Q无疑是你得以在不同的操作系l、不同的开发环境以及不同的业务领域之间U|驰骋的“抽象”本钱。?<br /></font> </p> <img src ="http://www.shnenglu.com/bloodsuck/aggbug/7936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-05-31 13:36 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++书籍上(转蝲Q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7934.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Wed, 31 May 2006 05:35:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7934.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/7934.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/7934.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/7934.html</trackback:ping><description><![CDATA[ <font face="Verdana">C++是一门广泛用于工业Y件研发的大型语言。它自n的复杂性和解决现实问题的能力,使其极具学术研究价值和工业价倹{和C语言一PC++已经在许多重要的领域大获成功?</font> <p> <font face="Verdana">然而,一个不可否认的现实是,在低阶程序设计领域,C++挤压着C同时也在承受着C的强烈反弹,而在高阶E序设计领域QJava和C#正在不断蚕食着C++的地盘。也许C++与C合ؓ一体永q都是一个梦惻I也许Java和C#的狂潮终迫使C++回归本位 ?回到它有着Ҏ性优势的开发领域:低pȝE序设计、高U大规模高性能应用设计、嵌入式E序设计以及数值科学计等。果真如此,我认未尝不是一件好事?</font> </p> <p> <font face="Verdana">C++吸引如此之多的智力投入,以至于这个领域的优秀作品Q包括重量的Y件品、程序库以及书籍{,C胜数。文题“C++E序设计之四书五l”一个不太严格的含义是:C++E序设计之四??五经。是的,在本文(及其下篇Q中Q我分门别cL?0多本C++好书Q你可以Ҏ自己的需要选读?</font> </p> <p> <font face="Verdana">TCPL和D&E </font> </p> <p> <font face="Verdana">TCPL和D&E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的Uͼ均出自Bjarne Stroustrup之手。我它们单列出来,首先是因为Bjarne是C++语言的创,然后是因为比“首先”那个原因更重要的原因:q两本书是C++领域毋庸|疑的杰作。说它们是C++语言圣经Qƈ不ؓq?</font> </p> <p> <font face="Verdana">Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition) <br />《C++E序设计语言Q特别版Q》,机械工业出版C?<br />《C++E序设计语言Q特别版Q(英文影印版)》,高等教育出版C?</font> </p> <p> <font face="Verdana">q今为止QTCPL是除了C++标准文献之外最权威的C++参考手册。和大多Ch的看法不大一P我认为Bjarne的文字语aq不逊色于他所创徏的程序语aQ至我喜欢q种学院气息厚的作品。本书对C++语言的描q轮廓鲜明、直截了当。它从C++语言创徏者的角度来观察C++Q这是Q何别的作者和书籍做不到的 ?没有M人比Bjarne自己更清楚该怎么来用C++?</font> </p> <p> <font face="Verdana">q是一本严肃的著作Q以中、高UC++开发h员ؓ目标读者。如果你是一名有l验的C++E序员,需要了解更加本质的C++知识Q本书正是ؓ你而写。它不是那种让你看了会不断窃喜的书Q需要用心体会,反复咀嚹{在阅读q程中,L别留心Bjarne先生了什么,又对什么一语带q。我个h比较喜欢q本书的W四部分“用C++做设计”,q样的内容在cM的程序设计语a书籍中很隄??我甚臌为Bjarne应该这部分独立出来单独写一本书?</font> </p> <p> <font face="Verdana">Bjarne Stroustrup, The Design and Evolution of C++ <br />《C++语言的设计和演化》,机械工业出版C?<br />《C++语言的设计和演化Q英文版Q》,机械工业出版C?</font> </p> <p> <font face="Verdana">D&E是一本关于C++语言设计原理、设计决{和设计哲学的专著。它清晰地回{了C++Z么会成ؓ今天q个样子而没有变成另外一U语a。作为C++语言的创,Bjarne淋漓致地展CZ他独到而深ȝ见解。除了广受赞誉的语言Ҏ外QBjarne没有回避那些引v争议的甚臌拒绝的C++Ҏ,他一一l出了逻辑严密、oZ服的解释。内Ҏ盖C++的史前时代、带cȝC、C++的设计规则、标准化、库、内存管理、多重ѝ模板等Q对包括异常机制、运行时cd信息和名字空间在内的重要的新Ҏ都分别q行了深入探讨。每一名C++E序员都应该可以从Bjarne的阐释中加深Ҏ中这门语a的认识?</font> </p> <p> <font face="Verdana">需要再ơ提醒的是,q两本书知识羃Q信息量极大Q请不要错过Bjarne每一句看似O不经意的话?</font> </p> <p> <font face="Verdana">入门教程 </font> </p> <p> <font face="Verdana">学习M一门语a都需要一个从入门到精通、从新手到高手@序渐q的q程。不q,对于一个所谓的新手而言Q究竟是一个完完全全的新手Q还是一个熟悉某U别的语a的“新手”,甚至是在某种语言E序设计领域已经颇有建树的高手,很难一概而论Q不同的C++新手需要不同的入门书籍?</font> </p> <p> <font face="Verdana">Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example <br />《Accelerated C++中文版》,中国电力出版C?</font> </p> <p> <font face="Verdana">和市面上大多数C++教程不同Q本书不是从“C++中的C”开始讲解,而是始于地道的C++Ҏ。从一开始就使用标准库来写程序,随着讲述的逐渐深入Q又一一解释q些标准库组件所依赖的基概念。另外,和其他C++教材不同的是Q这本书以实例拉动语a和标准库的讲解,对后两者的讲解是ؓ了给实例E序提供支持Q而不是像l大多数C++教材那样Q例子只是用作演CaҎ和标准库用法的辅助工具?</font> </p> <p> <font face="Verdana">作者在C++领域的编E实c教育培训以及技术写作方面都是世界一水准。我喜欢q种大量使用标准库和C++语言原生Ҏ的清新的写作风根{在q本教材面前Q几乎迄今ؓ止的所有C++教材都黯然失色或昑־q时。尽这本教材也许对于国内的高校教育来说有些前卫Q不q我仍然极力向我的同行们推荐。顺带一提,在Bjarne和我最q的一通信里,他这栯h书:对于有经验的E序员学习C++而言Q这本书可能是世界上最好的一本?</font> </p> <p> <font face="Verdana">Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition) <br />《C++ Primer (3RD)中文版》,中国电力出版C?</font> </p> <p> <font face="Verdana">q本书的名字多少有点让h误解。尽作者声U这本书是ؓC++新手而写Q但无论是它的厚度还是讲解的深度都暴露了gq如此。也许说它是一本“从入门到精通”的C++教程会更合适一些。我个h认ؓ它ƈ不适合完全不懂C++的初学??在阅读这本书之前Q你臛_应该先有那么一点C或C++的背景知识,或者至要h一些其他语a的编E经验?</font> </p> <p> <font face="Verdana">管q本书省略了一些高UC++Ҏ的讨论Q但仍然可以U得上是q今为止最全面的C++学习教程。事实上Q如果一名C++初学者能够扎扎实实地d本书q对照《C++ Primer Answer Book》完成全部习题的话,他的水^肯定可以q入职业C++E序员的行列。我个h认ؓQ即使你已经拥有了TCPLQ这本书依然有拥有的价|因ؓ在许多方面它比TCPL来得更详l、更易懂?</font> </p> <p> <font face="Verdana">Stanley B. Lippman, Essential C++ <br />《Essential C++中文版》,华中U技大学出版C?<br />《Essential C++Q媄印版Q》,中国电力出版C?</font> </p> <p> <font face="Verdana">可以不太严格地认本书是《C++ Primer》的_版。本书一一讲述了C++中最具代表性的主题Q包括过E式~程、泛型编E、基于对象编E、面向对象编E、模板编E以及异常处理等。Stanley门槛调低到“具有其他语aE序设计l验”的C++新手所能接受的最基本的层ơ,使他们能够迅速开始用C++~程而又免于阅读《C++ Primer》那L大部头。它以实例引导学习,力图使读者在最短的旉内把握C++的精_V?</font> </p> <p> <font face="Verdana">也许换一个h来概qC++~程范型QparadigmQ的Ҏ面面需要好几百|能说清楚Q但q本书不可思议地做Cq一炏V我个h非常喜欢q种满是技术、简明扼要ƈ且“有话好好说”的书。这本书同样h一个明昄风格Q所有程序例子全部采用标准库lgQ让目一新?</font> </p> <p> <font face="Verdana">以上三本书都不是Z完完全全的编E新手而写。完全的C++~程新手可以阅读Francis Glassborow的新书(未出版Q:《A Beginners Introduction to Computer Programming : You Can Do It!》。这也是Bjarne的推荐。Francis Glassborow是ACCUdQ多q来他对几乎每一本C++l典名著评头Q他自己的这一本自然会引vC++C的极大兴?</font> </p> <p> <font face="Verdana">高效、健壮编E?</font> </p> <p> <font face="Verdana">两年前我在负责一个省U电力调度系l项目时~写了一个网关程序,它从SCADApȝ获取电力实时信息。通讯接口采用了不常用的数据库直连方式Q这个网关程序一端连接SQL Server 6.5Q另一端连接Oralce 8.1.6Q。由于实时测点近万,每次全部取h新或插入一遍显然是低效的。我在网关程序里Z一个内存库Q获取到的数据首先在其中q行比较Q然后决定是否更新物理数据库Q同时还做了别的更复杂的事情……)Q从而在效率和资源占用两斚w辑ֈ了预期效果?</font> </p> <p> <font face="Verdana">q个E序一直运行得很好Q但在离开现场之后的某一天,pȝ理员打来电话,说大概因为网l故障等原因Q有时这个网关程序会崩溃??它自己崩掉也qŞ了,问题是它q会把Windows 2000 Advanced Server搞成“蓝屏”!坦白地说Q我q从来没看过哪个非蓄意的E序有这个“能耐”。由于当时正忙于另外一个大目Q无法去现场调试Q最后只有凭l验对内存库代码心翼地封装以异常处理代码Q同时也做了一些别的修改……)。这P虽然没有d解决问题Q但E序l究不再d那么隄了?</font> </p> <p> <font face="Verdana">在这儿讲q么一D花i有什么意思呢Q当初ؓ那个可怕的bug朝思暮x我可不认是一个“花i”)Q我惌的是Q对于Q何Y件而言Q离开强健Q效率也无从谈赗而对于C++E序员来_也许~写一个高效的E序q不难,但要~写一个需? ?24时持箋q行的服务端软g׃是那么容易了Q需要考虑许多因素Q有时这些因素甚臌q超出C++语言和开发工L本n。作Z名开发实际项目Y件的E序员,q非得自己钉子才能积累经验,只要我们_虚心Q别人的l验往往都是我们很好的借鉴。鉴于此Q我推荐以下几本书供你选读Q它们可以让你从强健和效率两斚w受益Q当然了Q它们涵盖的内容q不限于异常处理JQ?</font> </p> <p> <font face="Verdana">Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition) <br />Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs <br />《Effective C++中文版》,华中U技大学出版C?<br />《More Effective C++中文版》,中国电力出版C?<br />《Effective C++Q媄印版Q》,中国电力出版C?</font> </p> <p> <font face="Verdana">如果说《Effective C++》主要讨论C++中一些相对基的概念和技巧的话,那么《More Effective C++》则着重探讨了包括异常处理在内的一pd高技术。与前者相比,后者具有两大主要区别:其一Q它包含很多时新的标准C++的内容;W二Q它讨论的主题們֐于“战略化”而非“战术化”,q且讨论得更深入、更d。尤其是对虚析构函数、智能指针、引用计C及代理类Qproxy classeQ等技术和模式的深入程度,让h很难惌是出Cq样的一本小书之中?</font> </p> <p> <font face="Verdana">游刃有余的技术,高超的写作技巧,Scott无疑是世界上最优秀的C++技术作家之一。在z、清晰、易ȝ斚wQ这两本书都卓尔不群。MQScott提供的这85个可以改善编E技术和设计思维的方法,都是中、高UC++E序员必备的技能。我强烈推荐q两本书Q实际上q有一本,E后׃看到Q?</font> </p> <p> <font face="Verdana">Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions <br />Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions <br />《Exceptional C++中文版》,中国电力出版C?<br />《More Exceptional C++中文版》,华中U技大学出版C?</font> </p> <p> <font face="Verdana">你自认ؓ是一名C++语言专家吗?M读ISO C++标准委员会秘书长的这两本书再回答。在q两本书中,Herb采用了“问{”的方式指导你学习C++语言Ҏ。对于每一个专题,Herb首先合理地设惛_你的疑问和困惑,接着又猜出你十有八九是错误的解{,然后l你以指点ƈ提出最佌x案,最后还归纳决类似问题的普适性原则?</font> </p> <p> <font face="Verdana">q两本书是典型的qC++语言l节的著作,很薄Q但内容密集Q远q超qScott的那两本书,读v来很费脑{??我个为它们要比Scott的书难懂得多。若要研习这薄薄的两本书所包含的知识,臛_需要花Ҏ月的旉Q(在Scott的荐序中Q他坦陈不止一ơ陷入GotW问题的陷阱,你应该知道这意味着什么)对于语言l节的深I有什么好处呢Q尽在大多数情况下Q我们不必关心C++代码q后的动作,然而当我们不得不关心时Q这两本书可以ؓ我们提供很好的线索,因ؓ它们揭示了C++语言中微妙而又臛_重要的东ѝ?</font> </p> <p> <font face="Verdana">Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design <br />《C++E序设计陷阱》,中国青年出版C?</font> </p> <p> <font face="Verdana">Stephen的理论素d实践l验注定q是一本值得一ȝ好书。Stephen曄是贝实验室中第一批C++使用者。他已经使用C++成功解决了包括编译器、证怺易、电子商务以及嵌入式pȝ{领域中的问题。本书汇集了作者来自开发一U的99条编E真知灼见,z悉它们Q你可以避免几乎所有常见的C++设计和编E问题?</font> </p> <p> <font face="Verdana">我甚臌为,对于C++~程菜鸟而言Q阅读这本书会比阅读Scott和Herb的书更能L而立竿见影地获得更大的提高。我个h很喜Ƣ这本书的写作风??Stephen的许多观点看似极端却无可辩驳。当然了Q这U自信(以及冷幽默)来自于作者深厚的技术素养,而非自大的偏执?</font> </p> <p> <font face="Verdana">除了上面推荐的书c外QDov Bulka?David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的编E技术》,清华大学出版C)也值得一看。这本超薄小书聚焦于高性能C++应用E序开发。两位作者都是IBM软g专家Q都工作于对性能要求极高的系l构建领域,本书是他们的l验之谈。也有h不喜Ƣ这本书Q因为它׃不少的篇q讲q和C++无关的东西,我却恰恰因ؓq一点而对q本书生好感,正是q些东西让我开阔了眼界?</font> </p> <p> <font face="Verdana">模板和泛型编E?</font> </p> <p> <font face="Verdana">模板和基于模板的泛型~程无疑是当今发展最z跃的C++E序设计技术。模板的W一个革命性的应用是STLQ它模板技术在泛型容器和算法领域的q用展现得淋漓尽_而Boost、Loki{现代程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编E领域,我推荐以下两本重量著作Q?</font> </p> <p> <font face="Verdana">David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide <br />《C++ Templates全览Q繁体版Q》,台湾峰资讯股䆾有限公司 <br />《C++ Templates全览Q简体版Q》,人民邮电出版C?</font> </p> <p> <font face="Verdana">有一U老套的赞一本书的手法,大致是“没有看q这本书Q你怎么怎么地”,q里面往往夸张的成分居多。不q,倘若说“没有看q《C++ Templates: The Complete Guide》,你就不可能精通C++模板~程”,那么q个论断对于世界上绝大多数C++E序员来说是成立的?</font> </p> <p> <font face="Verdana">q本书填补了C++模板书籍领域由来已久的空白。此前,上有《Modern C++ Design》这L专注于模杉KU编E技术和泛型模式的著作,下有《The C++ Standard Library》这L针对特定模板框架和组件的使用指南。然而,假如Ҏ板机制缺乏深入的理解Q你很䏀上下”自如。鉴于此Q我向每一位望透彻理解C++模板技术的朋友推荐q本书?</font> </p> <p> <font face="Verdana">q本书在内地、台湑֐有一个译本,但出自不同的译者之手。当你看到这文章时Q两个译本应该都已经上市Q对于读者来说当然也多了一U选择。侯捷先生个人网站上开放了J体译本大部分章节,不妨先睹为快?</font> </p> <p> <font face="Verdana">Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied <br />《C++设计新思维Q泛型编E与设计模式之应用》,华中U技大学出版C?<br />《C++设计新思维Q媄印版Q》,中国电力出版C?</font> </p> <p> <font face="Verdana">你自认ؓ是C++模板~程高手吗?Lq这本书再回{J q是一本出自天才之手o人敬畏的C。泛型模式,无限延你的视野Q以挑战Q何一名C++E序员的思维极限?</font> </p> <p> <font face="Verdana">q本书共分ؓ两大部分Q第一部分讨论?LokiE序库采用的基础技术以及一些高U语aҎ,包括Z{略的类设计、模板局部特化、编译期断言、Typelist以及型对象分配技术等。第二部分则着重介l了Loki中的重要lg和泛型模式技术,包括泛化仿函敎ͼGeneralization FunctorQ、单ӞSingletonQ、智能指针、对象工厂(Object FactoryQ、抽象工厂(Abstract FactoryQ、访问者(VisitorQ以及多ҎQMultimethodsQ等。每一U技术都让h大开眼界Q叹止?</font> </p> <p> <font face="Verdana">在C++的学习方面,q犹不及往往成了不求甚解的借口。然而,面向对象qC++的全部,模板和泛型编E亦占半壁江山。对于“严肃”的C++E序员而言Q及时跟q这Ҏl例证的成功技术,不失为明Z举?</font> </p> <p> <font face="Verdana">l语 </font> </p> <p> <font face="Verdana">q些著作是如此大名鼎鼎,也许Ҏ不缺我一个推荐。然而,U늄C++E序员队伍的发展壮大速度不像其他更时髦的语言那样q速,ChqL多于旧h出。除了热忱地Ƣ迎ChQ我个h认ؓC对C++书籍q行“盘点”的时候了Qƈ且希望这L“盘点”有益于感兴的读者。请保持耐心和宽厚。在下篇中,我将l箋介绍标准库、网l编E以及其他方面的C++好书。有好书怼Q这个冬天不会冷</font> </p> <p> <font face="Verdana"> </font> </p> <p> <font face="Verdana"> </font> </p> <p> </p> <img src ="http://www.shnenglu.com/bloodsuck/aggbug/7934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-05-31 13:35 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ STL?转蝲)http://www.shnenglu.com/bloodsuck/archive/2006/05/31/7918.html黄大?/dc:creator>黄大?/author>Wed, 31 May 2006 02:01:00 GMThttp://www.shnenglu.com/bloodsuck/archive/2006/05/31/7918.htmlhttp://www.shnenglu.com/bloodsuck/comments/7918.htmlhttp://www.shnenglu.com/bloodsuck/archive/2006/05/31/7918.html#Feedback1http://www.shnenglu.com/bloodsuck/comments/commentRss/7918.htmlhttp://www.shnenglu.com/bloodsuck/services/trackbacks/7918.html
C++ STL?/td>
原创Q?a >怒火之袍 2002q?0?8?

一、STL?/h3>

STLQStandard Template LibraryQ标准模板库)是惠普实验室开发的一pd软g的统U。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一D|间?/p>

STL的代码从q义上讲分ؓ三类QalgorithmQ算法)、containerQ容器)和iteratorQP代器Q,几乎所有的代码都采用了模板cd模版函数的方式,q相比于传统的由函数和类l成的库来说提供了更好的代码重用Z。在C++标准中,STL被组lؓ下面?3个头文gQ?lt;algorithm>?lt;deque>?lt;functional>?lt;iterator>?lt;vector>?lt;list>?lt;map>?lt;memory>?lt;numeric>?lt;queue>?lt;set>?lt;stack>?lt;utility>。以下笔者就单介l一下STL各个部分的主要特炏V?/p>

二、算?/h3>

大家都能取得的一个共识是函数库对数据cd的选择对其可重用性v着臛_重要的作用。D例来_一个求Ҏ的函敎ͼ在用QҎ作ؓ其参数类型的情况下的可重用性肯定比使用整型作ؓ它的参数cL要高。而C++通过模板的机制允许推q对某些cd的选择Q直到真正想使用模板或者说Ҏ板进行特化的时候,STL利用了q一Ҏ供了相当多的有用法。它是在一个有效的框架中完成这些算法的——你可以所有的cd划分为少数的几类Q然后就可以在模版的参数中用一U类型替换掉同一U类中的其他cd?/p>

STL提供了大U?00个实现算法的模版函数Q比如算法for_eachؓ指定序列中的每一个元素调用指定的函数Qstable_sort以你所指定的规则对序列q行E_性排序等{。这样一来,只要我们熟悉了STL之后Q许多代码可以被大大的化Q只需要通过调用一两个法模板Q就可以完成所需要的功能q大大地提升效率?/p>

法部分主要由头文g<algorithm>Q?lt;numeric>?lt;functional>l成?lt;algorithm>是所有STL头文件中最大的一个(管它很好理解)Q它是由一大堆模版函数l成的,可以认ؓ每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修攏V移除、反转、排序、合q等{?lt;numeric>体积很小Q只包括几个在序列上面进行简单数学运的模板函数Q包括加法和乘法在序列上的一些操作?lt;functional>中则定义了一些模板类Q用以声明函数对象?/p>

三、容?/h3>

在实际的开发过E中Q数据结构本w的重要性不会逊于操作于数据结构的法的重要性,当程序中存在着Ҏ间要求很高的部分Ӟ数据l构的选择显得更加重要?/p>

l典的数据结构数量有限,但是我们常常重复着一些ؓ了实现向量、链表等l构而编写的代码Q这些代码都十分怼Q只是ؓ了适应不同数据的变化而在l节上有所出入。STL容器׃ؓ我们提供了这L方便Q它允许我们重复利用已有的实现构造自q特定cd下的数据l构Q通过讄一些模版类QSTL容器Ҏ常用的数据结构提供了支持Q这些模板的参数允许我们指定容器中元素的数据cdQ可以将我们许多重复而乏味的工作化?/p>

容器部分主要由头文g<vector>,<list>,<deque>,<set>,<map>,<stack>?lt;queue>l成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器Q,可以通过下表ȝ一下它们和相应头文件的对应关系?/p>
数据l构 描述 实现头文?/font>
向量(vector) q箋存储的元?/td> <vector>
列表(list) p点组成的双向链表Q每个结点包含着一个元?/td> <list>
双队?deque) q箋存储的指向不同元素的指针所l成的数l?/td> <deque>
集合(set) p点组成的U黑树,每个节点都包含着一个元素,节点之间以某U作用于元素对的谓词排列Q没有两个不同的元素能够拥有相同的次?/td> <set>
多重集合(multiset) 允许存在两个ơ序相等的元素的集合 <set>
?stack) 后进先出的值的排列 <stack>
队列(queue) 先进先出的执的排?/td> <queue>
优先队列(priority_queue) 元素的次序是׃用于所存储的值对上的某种谓词军_的的一U队?/td> <queue>
映射(map) 由{键,值}对组成的集合Q以某种作用于键对上的谓词排?/td> <map>
多重映射(multimap) 允许键对有相{的ơ序的映?/td> <map>

四、P代器

下面要说的P代器从作用上来说是最基本的部分,可是理解h比前两者都要费力一些(臛_W者是q样Q。Y件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,q种化在STL中就是用q代器来完成的。概括来_q代器在STL中用来将法和容器联pv来,L一U黏和剂的作用。几乎STL提供的所有算法都是通过q代器存取元素序列进行工作的Q每一个容器都定义了其本n所专有的P代器Q用以存取容器中的元素?/p>

q代器部分主要由头文?lt;utility>,<iterator>?lt;memory>l成?lt;utility>是一个很的头文Ӟ它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了q代器用的许多ҎQ而对?lt;memory>的描q则十分的困难,它以不同d的方式ؓ容器中的元素分配存储I间Q同时也为某些算法执行期间生的临时对象提供机制,<memory>中的主要部分是模板类allocatorQ它负责产生所有容器中的默认分配器?/p>

五、对初学者学习STL的一点徏?/h3>

对于之前不太了解STL的读者来_上面的文字只是十分概括地描述了一下STL的框ӞҎ理解STL的机制乃至用STL所起到的帮助微乎甚微,q不光是因ؓ深入STL需要对C++的高U应用有比较全面的了解,更因为STL的三个部分算法、容器和q代器三部分是互相牵制或者说是紧密结合的。从概念上讲最基础的部分是q代器,可是直接学习q代器会遇到许多抽象枯燥和繁琐的l节Q然而不真正理解q代器又是无法直接进入另两部分的学习的(臛_对剖析源码来说是q样Q。可以说Q适应STL处理问题的方法是需要花费一定的旉的,但是以此ZPSTL取得了一U十分可늚独立性,它通过q代器能在尽可能地知道某种数据l构的情况下完成对这一l构的运,所以下军_ȝSTL的朋友们千万不要被一时的困难d。其实STLq用的模式相对统一Q只要适应了它Q从一个STL工具到另一个工P都不会有什么大的变化?/p>

对于STL的用,也普遍存在着两种观点。第一U认为STL的最大作用在于充当经典的数据l构和算法教材,因ؓ它的源代码涉及了许多具体实现斚w的问题。第二种则认为STL的初衷乃是ؓ了简化设计,避免重复力_Q提高编E效率,因此应该是“应用至上”的Q对于源代码则不必深I。笔者则认ؓ分析源代码和应用q不矛盾Q通过分析源代码也能提高我们对其应用的理解Q当然根据具体的目的也可以有不同的侧重?/p>

最后要说的是,STL是ANSI/ISO C++标准的一部分Q所以对于一个可以有多种C++实现的过E,首先考虑的应该是STL提供的模板(高效且可UL性好Q,其次才是各个厂商各自相应的库Q高效但可移植性不好)以及自己ȝ写代码(可移植性好但低效)?/p>

]]>cL板(原创Q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7730.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Sat, 27 May 2006 09:55:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7730.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/7730.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7730.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/7730.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/7730.html</trackback:ping><description><![CDATA[ <pre>                             <font size="2"> q几天看了下模板 Q以下是个h的些心得Q高手见W了<br />1.cL?实例 对象定义 引v 实例?br />                            指针Q引?不会引v实例?br />c非型参敊W?只能?整ŞQ枚举,外联l,且应Z个常量编译时应定<br />                    点型,cȝ型,。。。都不可?br />2.class templates 的成员函?在调用和取地址时实例化Q在cd例化时不会自动实例化<br />3.class templates 的友元申?br />    a.非模版类?br />          friend class man;<br />          friend void f(void);<br />           friend void man::f(void);<br />   b.一对一的模版友?br />             friend class man<T>;<br />             friend void f<T>( man<T>);<br />             friend void man<T>::f();<br />    c.一对多的模版友?br />          template <typename T><br />               friend class man;<br />           template <typename T><br />              friend void  f( T);<br />           template <typename T><br />              friend void man<T>::f();<br />4.cL版的静态成?<br />      q不在模版定义时实例化,在类模版实例化时实例化,对应1个类?br />template <typename T><br />int man<T>::size=10;<br />而成员函数应?br />  template <typename T><br />   void man<T>::f(void)<br />{<br />..........................................<br />}<br />5.成员模版 可以是普通类?模版c?br />如:<br />class woman                                             <br />{<br />public:<br /> template <typename T><br />  class man<br /> {<br /> public:<br />  print(T a)<br />  {<br />   cout<<a;<br />    <br />  }</font></pre> <p> <font size="2"> };<br /> template <typename T2><br />  void print(T2 a)<br /> {<br />  cout<<a;<br /> };<br />protected:<br />private:<br />};<br />                         1个好的例?br />                           template <typename T>   class A  <br />                                {      public:<br />                                                      template <typename T1>               <br />                                                      A&    operator =(const A<T1> & );<br />                               }<br />                               如此 则A 的对?可以用其他型的对象赋g<br />     在用时才实例化<br />                                        但是其定义比较骇?br />                         template <typename T> <br />                                     template<typename T1><br />                                     A<T>&  A<T>::operator=(const A<T1>& a)<br />                                   {  ...........................}<br /><br /><br /><br />6.cL版的特化<br />      特化1个类模板Q所有成员必ȝ化包括静态类数据成员(vc),但友元模板(1Q?Q可?br />不特化,当作一个显C实参的函数模板处理卛_Q??特化1个模?成员函数<br /><br />         模板成员函数特化是定义必d现在实现文gQcpp)?br />       语法?br />    void man<int>::f(void)<br />{<br />............................<br />}<br />      <br />cȝ?br /> template <><br />class man<int><br />{<br />       ......//中所有类型参Cint 替代<br />};<br />      <br />  man<int>::man()<br />{<br />......<br />}<br /><br />void man<int>::f(void)<br />{<br />}<br />注意  cL员中<br />   static const 有序cd可以在体内初始化static const int a=10;<br />                        仅仅static  必须在体?br />                                                               static int a;<br />                                                              int woman::a=10;<br />   ?特化<br />   template <typename T><br />   int man<T>::size=10;<br />   特化<br />   int man<char>::size=10;<br />7偏特?br />   cL板有1个以上模版参敎ͼcd参数Q非cd参数Q?br />              某些模版参数 被实际的型和值取代(注意?取代 Q不是增加,减少Q?br />      如:<br /><br />//////////////////头文?br />       template <typename T1,typename T2,int size><br />class wc<br />{<br />public:<br /> wc()<br /> {<br />  cout<<"\n int T1,T2, int";<br /> }<br />protected:<br />private:<br />};<br />template <typename T,int size><br />class  wc<T* ,T,size><br />{<br />public:<br /> wc()<br /> {<br />  cout<<"\n in T *, T ,size";<br /> }<br />protected:<br />private:<br />};<br />template <typename T,int size><br />class  wc<T* ,float,size><br />{<br />public:<br /> wc()<br /> {<br />  cout<<"\n in T* ,float,size";<br /> }<br />protected:<br />private:<br />};<br />template <typename T><br />class  wc<T* ,float,80><br />{<br />public:<br /> wc()<br /> {<br />  cout<<"\n in T* ,float,80";<br /> }<br />protected:<br />private:<br />};<br />///////头文?br />//////main()<br />wc<int,float,10> wc1;<br /> wc<int* ,int ,20> wc2;<br /> wc<int*,float,39> wc3;<br />wc<int*,float,80>wc4;<br />///////main() ,在vc 7 上通过<br />//////main()<br /><br /><br />8.预设模板参数(只有在类模板中才指定 Q? .  明确指定 a<int,int>   ,直接定义?man<>  kkk;2. a<T,T> )<br />template <typename T,typename T1=float><br />class man<br />{<br />..........<br />}<br /><br />写到q里H然惛_<br />                  class A {<br />                            virtual void   print();<br />                              };<br />                  class B:public A {<br />                                          virtual void print();<br />                                          };<br />B b;<br />                 A *a =&b;<br />                a->print();//调用 B的,此时 print()中的this 指针是 B * const,使用B 的接口?<br /><br />9.双重模板参数Q很有用Q?br />                template <typename T,typename G =man<T> ><br /> class baby<br /> {<br /> public:<br />  baby ()<br />  {<br />   cout<<"\n in baby";<br />  }<br /> protected:<br /> private:<br /> };//cd参数可以?cȝ?br />         <br />baby<int, man<float> > b;  //ok<br />////////////////////////<br />template <typename T,template <typename G> class TT>//可以省略?template <typename T  ,template<typename>  class  TT><br /> class  son<br /> {<br /> public:<br />   TT<T> * a; <br />     son()<br />  {<br />           a=0;<br />   cout<<"\n in son";<br />  }<br /> protected:<br /> private:<br /> };<br />   son<int, man> b;//则就含有?man<int > * a;<br />TT 是模板占位符P是一个带1个类型参数的cL板,如果其有默认模板参数 则忽略掉  <br />所以 GG若带默认 的模?应该如下<br />            template <typename T, template <typename T2, typename= man<T2>  > class GG><br />class son<br />{<br />}</font> </p> <p> <font size="2">/////////   cL板类型参?同时q可以是 cL?br /><br />10. 字符串常量在模板中的注意事项<br /><br />           char * a="hi ,friend ";///"hi, friend"  文字帔R ?const char [10] cd  左D{换到 const char * <br />限定转换?char *,<br />                template <typename T?br />      ostream& operator <<(ostream & os, const T & b)Q?/注意只有const 才能接受临时变量<br /><br />             cout<<"hi,friend";   <br />              cout<<"bad";<br />/////2个不同的模板实例<br />   typeid(变量).name();///直接打印出变量类?br />写到q,闲扯下:<br />    栈区Q堆区,全局Q静态)区,文字帔RQ代码区Q?个大区,q个是我听说?br />////////////////////////////////////////////////<br />11.模板的编译模?br />     在实例化点必能扑ֈ定义//原则<br />                           只能使用包含模式了,<br />a..h. cpp 在?h最后一行包含进 cpp<br />b. 全部在h ?cpp<br /><br />                     分离模式,目前支持的export 关键字i的编译器很少Qvc.net 不支持)</font> <br /> <br />12.<br />函数指针cd也能做模板类型参?br /><br /></p> <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">bool</span> <span style="COLOR: #000000"> minn(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> a,</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> b)<br /><img id="Codehighlighter1_23_40_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_40_Open_Text.style.display='none'; Codehighlighter1_23_40_Closed_Image.style.display='inline'; Codehighlighter1_23_40_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_23_40_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_40_Closed_Text.style.display='none'; Codehighlighter1_23_40_Open_Image.style.display='inline'; Codehighlighter1_23_40_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span id="Codehighlighter1_23_40_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_23_40_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> a</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">b;<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" /> template </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">typename T1,typename T2</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff">const</span> <span style="COLOR: #000000"> T1</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">  mymin(</span> <span style="COLOR: #0000ff">const</span> <span style="COLOR: #000000"> T1</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> t1, </span> <span style="COLOR: #0000ff">const</span> <span style="COLOR: #000000"> T1</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000"> t2, T2 t3 )<br /><img id="Codehighlighter1_137_166_Open_Image" onclick="this.style.display='none'; Codehighlighter1_137_166_Open_Text.style.display='none'; Codehighlighter1_137_166_Closed_Image.style.display='inline'; Codehighlighter1_137_166_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_137_166_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_137_166_Closed_Text.style.display='none'; Codehighlighter1_137_166_Open_Image.style.display='inline'; Codehighlighter1_137_166_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span id="Codehighlighter1_137_166_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_137_166_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> t3(t1,t2)</span> <span style="COLOR: #000000">?</span> <span style="COLOR: #000000">t1:t2;<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" /> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_180_205_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_205_Open_Text.style.display='none'; Codehighlighter1_180_205_Closed_Image.style.display='inline'; Codehighlighter1_180_205_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_180_205_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_205_Closed_Text.style.display='none'; Codehighlighter1_180_205_Open_Image.style.display='inline'; Codehighlighter1_180_205_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span id="Codehighlighter1_180_205_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_180_205_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />cout</span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000">mymin(</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000">3</span> <span style="COLOR: #000000">,minn);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p> <br />13.<br />模板参数可以是个cL板 ?<br />template <typename T> <br />class a<br />{<br />};<br />a< vector <int> >;<br /><br /><br />template <typename T, typename T2,template <typename T,typename T2> class con  ><br />void add(con<T,T2>,con<T,T2>)<br />{<br /> cout<<"ok";<br />}<br /><br />add(a,b)//Ҏ在于 需要推?vc 7 可以从?cL板中推导出参数类?/p> <p>template <typename T,template <typename T2,typename T3> class con ><br />class ggoo<br />{<br />public:<br /> con<T,T> a;<br />con<int,int> b;<br /><br />protected:<br />private:<br />};<br /><br />ggoo<int,double, b> kk;//b<int,double>, con 的模板参数可以Q?br /> </p> <img src ="http://www.shnenglu.com/bloodsuck/aggbug/7730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-05-27 17:55 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数模板(原创Q?/title><link>http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7728.html</link><dc:creator>黄大?/dc:creator><author>黄大?/author><pubDate>Sat, 27 May 2006 07:31:00 GMT</pubDate><guid>http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7728.html</guid><wfw:comment>http://www.shnenglu.com/bloodsuck/comments/7728.html</wfw:comment><comments>http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/bloodsuck/comments/commentRss/7728.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bloodsuck/services/trackbacks/7728.html</trackback:ping><description><![CDATA[      template <typename T><br /> T f(T a1,T a2)<br />{<br />.........................<br />}<br /><br /><br />昄实参<br />f<int >(1,2);<br />昄实例?br />template  int f<int >(int ,int);Q申明)<br />昄特化<br />  template <> int f<int> (int,int)Q定义)<br />{<br /><br />      ...........<br />}<br />强制 从模版中挑?br /> <br />f<>(2,3);<br /><br />在函数调用,取函数地址?实参推演Q左|限定Q基c)<br /> int (* p)(int ,int)=&f;     int(*p) (int ,int )=& f<int,int><br />  f(2,3);                             f<int,int>(2,3);<br />1.~译模版Ӟ~译器检?br />2.实例化时Q在实例化点 再编译)Q编译器?br /><br />函数模版 只能出现在模版定义中<br />函数模版实例 可以出现在模版定义和非定义中<br />//////////////////////<br />1.非模版函C先?br />2.候?--〉可行实例化Q有特化否〈)Q有非模版否Q?-〉选中<br />3.依赖模版参数的在实例点解析,不依赖的在模版定义时解析<img src ="http://www.shnenglu.com/bloodsuck/aggbug/7728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bloodsuck/" target="_blank">黄大?/a> 2006-05-27 15:31 <a href="http://www.shnenglu.com/bloodsuck/archive/2006/05/27/7728.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.rsfrw.cn" target="_blank">91þþƷ˾þ</a>| <a href="http://www.txslcc.cn" target="_blank">˾þþƷ</a>| <a href="http://www.kimhi.cn" target="_blank">þþܳ</a>| <a href="http://www.lhjban.cn" target="_blank">91Ʒ91þ</a>| <a href="http://www.airesou.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.dui46.cn" target="_blank">þþƷˬӰ</a>| <a href="http://www.zqbd.com.cn" target="_blank">뾫Ʒþþɫ </a>| <a href="http://www.zhangjiaying.cn" target="_blank">þþƷ</a>| <a href="http://www.uuribao.com.cn" target="_blank">þݺҹҹ2020һ</a>| <a href="http://www.ozkz.cn" target="_blank">˾ҹվھƷþþþþþþ </a>| <a href="http://www.1000su.cn" target="_blank">˾þô߽avӰԺ</a>| <a href="http://www.156v7.cn" target="_blank">һþۺ³³</a>| <a href="http://www.bbctp.cn" target="_blank">þþþһƷ</a>| <a href="http://www.nfnv.cn" target="_blank">ŷ޹׾þþþþþ</a>| <a href="http://www.ptmei.cn" target="_blank">ɫۺϾþþþۺ99</a>| <a href="http://www.forseor.cn" target="_blank">Ʒþþһ</a>| <a href="http://www.jinhangroup.cn" target="_blank">þˬˬAV</a>| <a href="http://www.fylmbd.cn" target="_blank">vaĻþ</a>| <a href="http://www.00225858.cn" target="_blank">ɫۺϾþĻ</a>| <a href="http://www.ctcscs.cn" target="_blank">þþþëƬ</a>| <a href="http://www.qzlhscqt.cn" target="_blank">ҹþӰԺ</a>| <a href="http://www.coscoshuai.cn" target="_blank">ũ帾ŮëƬƷþ</a>| <a href="http://www.nmbm.com.cn" target="_blank">þþþƷձһ</a>| <a href="http://www.yichengsh.com.cn" target="_blank">޹պŷþ</a>| <a href="http://www.k1822.cn" target="_blank">뾫Ʒþþɫ</a>| <a href="http://www.9394cn.cn" target="_blank">þһ</a>| <a href="http://www.shibaba.cn" target="_blank">þ߿ۿƷ㽶</a>| <a href="http://www.tongdiaocj.cn" target="_blank">ƷۺϾþõһҳ</a>| <a href="http://www.dewy.com.cn" target="_blank">һAëƬѹۿþþƷ</a>| <a href="http://www.e-bizcard.cn" target="_blank">޹Ʒþһ</a>| <a href="http://www.qhklmy.cn" target="_blank">ƷŮþþ</a>| <a href="http://www.176zfblp.cn" target="_blank">þþùҺ</a>| <a href="http://www.h7629.cn" target="_blank">޾Ʒþǧն</a>| <a href="http://www.chainou.cn" target="_blank">ݺɫþþۺϲ</a>| <a href="http://www.jinxing168.net.cn" target="_blank">ɫۺϾþۺ</a>| <a href="http://www.hgrnoko.cn" target="_blank">þwww˳_Ƭ</a>| <a href="http://www.tjppfdm.cn" target="_blank">þþƷavӰԺ</a>| <a href="http://www.fa808.cn" target="_blank">뾫Ʒþþþ</a>| <a href="http://www.zesf.com.cn" target="_blank">ۺϾþþƷɫ</a>| <a href="http://www.xiquwang.com.cn" target="_blank">2020þþƷ</a>| <a href="http://www.0352quan.cn" target="_blank">˾þþƷӰԺ</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>