??xml version="1.0" encoding="utf-8" standalone="yes"?>国产91色综合久久免费分享,无码任你躁久久久久久久,久久久久国产精品三级网http://www.shnenglu.com/neverwinter/category/11741.htmlzh-cnMon, 20 Jun 2011 07:57:57 GMTMon, 20 Jun 2011 07:57:57 GMT60C++查Q点类型能否{换ؓ整型http://www.shnenglu.com/neverwinter/archive/2011/06/19/148964.htmlnelsonnelsonSun, 19 Jun 2011 08:06:00 GMThttp://www.shnenglu.com/neverwinter/archive/2011/06/19/148964.htmlhttp://www.shnenglu.com/neverwinter/comments/148964.htmlhttp://www.shnenglu.com/neverwinter/archive/2011/06/19/148964.html#Feedback0http://www.shnenglu.com/neverwinter/comments/commentRss/148964.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/148964.html
毕竟q个东西是我们目l的入门l习Q当q很多新人刚q来Q老组镉K会教他们用MFC/QT做个计算器来看看水^。由于各U原因,我当q倒是没有受到q种“C遇”Q等我真正开始做软g的时候,q是服务器端q样的纯C++代码做得比较多。但是不做不知道Q一做才发现UI的逻辑q是挺复杂的Q比如说Q按“1”是追加到当前昄q是覆盖现有的显C呢Q最后把逻辑弄清楚倒不是很ȝQ但要写出好看的代码q是有比较大的差距的?br />
以上都是前言Q好像比较长……

要说的是Q在q个q程中发现的问题Q计结果是点敎ͼ要怎么判断其是否能无损地{换成整数Q从而消除小数点后的一D|用的“0”Q以更好地显C。直接上代码Q?br />
 1 template <typename FloatType>
 2 struct _floattype_meta
 3 {
 4 };
 5 
 6 template<>
 7 struct _floattype_meta<float>
 8 {
 9     enum {
10         EXPO_OFFSET = 23,
11         EXPO_LEN = 8
12     };
13 
14     typedef uint32_t match_uint_type;
15 };
16 
17 template<>
18 struct _floattype_meta<double>
19 {
20     enum {
21         EXPO_OFFSET = 52,
22         EXPO_LEN = 11
23     };
24 
25     typedef uint64_t match_uint_type;
26 };
27 
28 template <typename FloatType>
29 struct float_to_int
30 {
31     typedef struct _floattype_meta<FloatType> _meta;
32 
33     bool operator() ( FloatType f, FloatType precision )
34     {
35         static const _meta::match_uint_type EXPO_MASK = 
36             (~((~(_meta::match_uint_type)0<< _meta::EXPO_LEN )) << _meta::EXPO_OFFSET;
37         _meta::match_uint_type* pf = (_meta::match_uint_type*)&f;
38         uint32_t expo = ((*pf) & EXPO_MASK) >> _meta::EXPO_OFFSET;
39 
40         static const uint32_t EXPO_FIRSTBIT_MASK = 1<< (_meta::EXPO_LEN-1);
41         static const uint32_t EXPO_BOUND = EXPO_FIRSTBIT_MASK - 1;
42         if ( expo >= EXPO_BOUND )
43         {
44             uint32_t to_right_move = expo - EXPO_BOUND;
45             if ( to_right_move >= _meta::EXPO_OFFSET )
46             {
47                 return true;
48             }
49             uint32_t cmp_len = _meta::EXPO_OFFSET - to_right_move;
50             _meta::match_uint_type mask = ~(~((_meta::match_uint_type)0<< cmp_len);
51             return (*pf&mask) ? false : true;
52         }
53         else
54         {
55             return ( f < precision && f > -precision ) ? true : false;
56         }
57     }
58 };

我的Ҏ是通过点型的l构来进行判断?br />
点cd一般结构如下:
|+/-|      exponent       |             tail                 |
对于floatQ指数部分ؓ8字节Q尾数部分ؓ23字节?br />
对于doubleQ指数部分ؓ11字节Q尾数部分ؓ52字节?br />其中指数部分是采用偏UL式的Q比如float的指数部分ؓ130Q偏Udgؓ127Q即实际指数?30-127?br />更详l的请参?a target="_blank" >q里?/div>
判断Ҏ是,计算指数的|Ҏ偏移判断数点后的尾敎ͼ惛_比较单,汗!
引入参数_ֺ是ؓ了判断值小?时达到某个阈值的时候可以将后面的小数略厅R?br />
HonestlyQ其实这个应该可以用sprintfQ然后判断小数点后的“0”来实现的Q似乎更加简单方ѝ?br />但是我觉得,作ؓ一?#8220;码农”Q重造轮子也是一U趣呛_Q?img src ="http://www.shnenglu.com/neverwinter/aggbug/148964.html" width = "1" height = "1" />

nelson 2011-06-19 16:06 发表评论
]]>Archlinux~译ACE时出的问?/title><link>http://www.shnenglu.com/neverwinter/archive/2011/01/15/138574.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Sat, 15 Jan 2011 09:08:00 GMT</pubDate><guid>http://www.shnenglu.com/neverwinter/archive/2011/01/15/138574.html</guid><wfw:comment>http://www.shnenglu.com/neverwinter/comments/138574.html</wfw:comment><comments>http://www.shnenglu.com/neverwinter/archive/2011/01/15/138574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/neverwinter/comments/commentRss/138574.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/neverwinter/services/trackbacks/138574.html</trackback:ping><description><![CDATA[官方有个比较_的编译安装指南,?a >q里</a>。但是对于我所到的问题没有说?br><br>提示链接时SSL的符h有找刎ͼ但我是装好了openssl的,也特意找了一下,都安装在/usr/?br><br>然后ȝ了一下build/examples/IPC_SAP/SSL_SAP/下的MakefileQ找?#8220;LIBS = -lrt -ldl”Q没有指明openssl库的链接<br><br>遂加上!?br><br>LIBS = -lrt -ldl -lssl<br><br>~译之!?br><br>build/test/SSL的问题同解?br><br>不知道其他Linux发行版有没有q样的问题,q是我的配置有问题,但ȝ最l编译完了?br><br><img src ="http://www.shnenglu.com/neverwinter/aggbug/138574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/neverwinter/" target="_blank">nelson</a> 2011-01-15 17:08 <a href="http://www.shnenglu.com/neverwinter/archive/2011/01/15/138574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>new/delete operatorW记http://www.shnenglu.com/neverwinter/archive/2010/07/19/120793.htmlnelsonnelsonMon, 19 Jul 2010 10:21:00 GMThttp://www.shnenglu.com/neverwinter/archive/2010/07/19/120793.htmlhttp://www.shnenglu.com/neverwinter/comments/120793.htmlhttp://www.shnenglu.com/neverwinter/archive/2010/07/19/120793.html#Feedback0http://www.shnenglu.com/neverwinter/comments/commentRss/120793.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/120793.html2.没有对应的operator delete会出现warningQvs2008Q?br>3.operator new/delete是类成员的情况下Q用自定义的operator new创徏、调用构造函敎ͼ会自动调对应的operator delete来析?br>4.delete操作W可以带多参敎ͼ要用自定义的operator new只能昑ּ调用
5.自定义的operator delete不会自动析构对象



nelson 2010-07-19 18:21 发表评论
]]>
关于vs2008 SP1中CMFCToolBar的一些事?/title><link>http://www.shnenglu.com/neverwinter/archive/2010/05/20/115984.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Thu, 20 May 2010 15:53:00 GMT</pubDate><guid>http://www.shnenglu.com/neverwinter/archive/2010/05/20/115984.html</guid><wfw:comment>http://www.shnenglu.com/neverwinter/comments/115984.html</wfw:comment><comments>http://www.shnenglu.com/neverwinter/archive/2010/05/20/115984.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.shnenglu.com/neverwinter/comments/commentRss/115984.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/neverwinter/services/trackbacks/115984.html</trackback:ping><description><![CDATA[话说昨天解决了MFC跨线E操作控件的问题Q我满以Z天可以free一回,玩玩Linux、学学Vim、再准备一下毕业论文的事情Q但q是有事情要做,然后又是“?#8221;MFC郁闷了一天?br><br>先介l一下M的情c我们项目客L的开发环境是VS2008+SP1Q用的是MFCcdQ里面居然用CCMFCToolBar、CMFCMenuBar以及Appearance变化{的SPI新特性。说“居然”是因些东西不是项目必要的Q当时可能也以ؓ只是名字变了用法没变Q估计在工程创徏的时候根本就没有考虑q些Q直接按着单文档工E默认配|,next、next直接创徏完的Q囧Q当时做的时候也只是当作试Demo来用Q也没太在意Q毕竟我们项目的重点在服务器而非q个MFC客户端?br><br>后来׃目原因Q甲方要求我们把q个客户端尽快修Ҏ一个可以发布版本。不改不知道Q一改吓一跻I当准备动手修改工h时才发现与以前惯的CToolBar真实差距甚大。CToolBar可以用CImageList把自定义的BMP囄攑ֈ工具栏的按钮Q详l可?a >q里</a>QCMFCToolBarҎ׃是这L一个玩法。直接放一个CToolBar上来Q在DockControlBar()的时候会出现断言错误Q缺DockBarQ貌似是q个名字Q汗Q)。定位代码到MainFrm的EnableDocking()Q现在的MainFrm的承关pLCMainFrm->CFrameWndEx->CFrameWndQ而以前是CMainFrm->CFrameWndQCFrameWndEx::EnableDocking()是ؓDockPane()服务的,而DockControlBar()需要的DockBarq不会被初始化。调用基cȝCFrameWnd::EnableDocking()后再DockControlBar()不会出现断言Q但是那个工h没有昄。而且现在新特性下在工h位置能够按出右键菜单Q但右键菜单中根本不可能有关于该CToolBar的信息,乍看h很不和谐~<br><br>最后,求助本地MSDN无果Q貌似SP1没有包含对MSDN文档的更斎ͼ求助MSDN官网Q那个真?#8220;a意赅”。只能说QMS你这ơ真?#8220;?#8221;了!<br><br>以下为google + vs2008 sp1 sample + 看代码的成果Q?br> <ul> <li>创徏默认ToolBar外的W二个ToolBar</li> </ul> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"></span><span style="color: #008080;">1</span> //默认工具?br><span style="color: #008080;">2</span> m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, <br><span style="color: #008080;">3</span>                WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);<span style="color: #000000;"><br></span><span style="color: #008080;">4</span> <span style="color: #000000;">//自定义工h<br></span><span style="color: #008080;">5</span> <span style="color: #000000;">m_mybar.CreateEx(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">, TBSTYLE_FLAT, <br></span><span style="color: #008080;">6</span><span style="color: #000000;">                  WS_CHILD </span><span style="color: #000000;">|</span><span style="color: #000000;"> WS_VISIBLE </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_TOP </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_GRIPPER </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_TOOLTIPS </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_FLYBY </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_SIZE_DYNAMIC, <br></span><span style="color: #008080;">7</span><span style="color: #000000;">                  CRect(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">), <span style="color: red;">ID_MYBAR</span>);</span></div> <br>注意QWizard生成的工hCreate时没有带IDQ但W二个工hCreate时最好要带ID。加了ID之后Q在工具栏右键菜单才会出现第二个工具栏的CheckBox。否则,不良后果有:1、右键菜单没有该工具栏CheckboxQ?、把默认工具栏和该工h拖出来(动Q,可以看到名字都是一LQ英文版为StandardQ;3、后面要提到的UserImage不能作ؓ按钮图标昄?br><br> <ul> <li>加蝲工具栏资?/li> </ul> 我们先来看看CMFCToolBar加蝲工具栏的函数原型Q?br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span> <span style="color: #0000ff;">virtual</span><span style="color: #000000;"> BOOL LoadToolBar(UINT uiResID, UINT uiColdResID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">, UINT uiMenuResID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">, BOOL bLocked </span><span style="color: #000000;">=</span><span style="color: #000000;"> FALSE,<br></span><span style="color: #008080;">2</span> <span style="color: #000000;">        UINT uiDisabledResID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">, UINT uiMenuDisabledResID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">,  UINT uiHotResID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div> 可以看出QuiResID代表要加载的工具栏资源,理论上只需要这一个参数就能完成工h的加载。但是VS的Toolbar Editor只能~辑4bit的工h图标Q以前CToolBar是用CImagList来加载更多bits的图标的Q现在应该怎么做呢Q多亏了Explore sample的例子,我发现后面的几个UINT参数是BMP的资源,最主要的是最后一个uiHotResIDQ即便其他用默认|q项赋BMP IDp按预期的图标昄。Cold、Disable表示的是不同状态下的图标样式,带Menu的是Menu有关的图标,具体可看SP1 Feature的sample?br>我的Demo里自定义工具栏的dE:<br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>     <span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;"> !</span><span style="color: #000000;">m_mybar.CreateEx(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">, TBSTYLE_FLAT, <br></span><span style="color: #008080;">2</span><span style="color: #000000;">                            WS_CHILD </span><span style="color: #000000;">|</span><span style="color: #000000;"> WS_VISIBLE </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_TOP </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_GRIPPER </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_TOOLTIPS </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_FLYBY </span><span style="color: #000000;">|</span><span style="color: #000000;"> CBRS_SIZE_DYNAMIC, <br></span><span style="color: #008080;">3</span><span style="color: #000000;">                            CRect(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">), ID_MYBAR) </span><span style="color: #000000;">||</span><span style="color: #000000;"><br></span><span style="color: #008080;">4</span> <span style="color: #000000;">         </span><span style="color: #000000;">!</span><span style="color: #000000;">m_mybar.LoadToolBar( IDR_TOOLBAR1, </span><span style="color: #000000;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">0</span><span style="color: #000000;">, FALSE, </span><span style="color: #000000;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">0</span><span style="color: #000000;">, theApp.m_bHiColorIcons</span><span style="color: #000000;">?</span><span style="color: #000000;">IDB_BITMAP1:</span><span style="color: #000000;">0</span><span style="color: #000000;"> ) )<br></span><span style="color: #008080;">5</span> <span style="color: #000000;">    {<br></span><span style="color: #008080;">6</span> <span style="color: #000000;">        TRACE0(</span><span style="color: #000000;">"</span><span style="color: #000000;">Failed to create toolbar\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">7</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">return</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: #008000;">//</span><span style="color: #008000;"> fail to create</span><span style="color: #008000;"><br></span><span style="color: #008080;">8</span> <span style="color: #008000;"></span><span style="color: #000000;">    }<br></span><span style="color: #008080;">9</span> <span style="color: #000000;">    m_mybar.SetWindowText(_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">));</span></div> 最后的SetWindowText()讄工具栏的名称?br>CMFCToolBar有LoadBitmap的方法,但是试发现Q用LoadToolBar只加载工h资源Q再用LoadBitmap加蝲BMP资源Q虽然返回值是TRUEQ但昄图标为空白,没有实际效果?br><br> <ul> <li>工具栏停?/li> </ul> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">1   //</span><span style="color: #008000;"> TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable</span><span style="color: #008000;"><br></span><span style="color: #008080;">2</span><span style="color: #000000;">   m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">3</span><span style="color: #000000;">   m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">4</span><span style="color: #000000;">   <span style="color: red;">m_mybar.EnableDocking(CBRS_ALIGN_ANY);</span><br></span><span style="color: #008080;">5</span><span style="color: #000000;">   EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">6</span><span style="color: #000000;">   DockPane(</span><span style="color: #000000;">&</span><span style="color: #000000;">m_wndMenuBar);<br></span><span style="color: #008080;">7</span><span style="color: #000000;">   DockPane(</span><span style="color: #000000;">&</span><span style="color: #000000;">m_wndToolBar);<br></span><span style="color: #008080;">8</span><span style="color: #000000;">   <span style="color: red;">DockPane(</span></span><span style="color: red;">&m_mybar);</span></div> 与默认工h无异?br><br> <ul> <li>用户自定义图?/li> </ul> CMFCToolBar可以让用戯定义工具栏图标,使用静态成员函数SetUserImages()一个CMFCToolBarImages对象讄q去Q由所有CMFCToolBar对象׃n。Wizard自动生成代码中有q样的例子:<br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"> 1</span>     <span style="color: #0000ff;">if</span><span style="color: #000000;"> (CMFCToolBar::GetUserImages() </span><span style="color: #000000;">==</span><span style="color: #000000;"> NULL)<br></span><span style="color: #008080;"> 2</span> <span style="color: #000000;">    {<br></span><span style="color: #008080;"> 3</span> <span style="color: #000000;">        </span><span style="color: #008000;">//</span><span style="color: #008000;"> load user-defined toolbar images</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 4</span> <span style="color: #008000;"></span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (m_UserImages.Load(_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">.\\UserImages.bmp</span><span style="color: #000000;">"</span><span style="color: #000000;">)))<br></span><span style="color: #008080;"> 5</span> <span style="color: #000000;">        {<br></span><span style="color: #008080;"> 6</span> <span style="color: #000000;">            m_UserImages.SetImageSize(CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">, </span><span style="color: #000000;">16</span><span style="color: #000000;">), FALSE);<br></span><span style="color: #008080;"> 7</span> <span style="color: #000000;">            CMFCToolBar::SetSizes(CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">), CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">));<br></span><span style="color: #008080;"> 8</span> <span style="color: #000000;">            CMFCToolBar::SetUserImages(</span><span style="color: #000000;">&</span><span style="color: #000000;">m_UserImages);<br></span><span style="color: #008080;"> 9</span> <span style="color: #000000;">        }<br></span><span style="color: #008080;">10</span> <span style="color: #000000;">    }</span></div> q个例子加蝲了工E\径下的一个BMPQ其他方法可以查看MSDNQ与CImageList有点点类伹{?br>使用CMFCToolBar::ReplaceButton()可以替换已有的工h按钮Q以下是我的Demo中的代码Q?br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>     <span style="color: #000000;">m_mybar.ReplaceButton( ID_QTLOGO, CMFCToolBarButton(ID_QTLOGO, </span><span style="color: #000000;">0</span><span style="color: #000000;">, _T(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">), TRUE) );</span></div> W一个参数ID_QTLOGO定义工具栏上的一个按钮,后面是一?span style="color: #000000;">CMFCToolBarButton的时对象?/span><span style="color: #000000;">CMFCToolBarButton构造函数第一个参Cؓ替换</span>后的IDQ第三个参数为名UͼW二个参Cؓ图标的烦?zero-based)Q第四个参数为m_bUserButtonQ指明第二个参数是烦引工h已加载图?LoadToolBar或LoadBitmap)q是用户自定义图标(SetuserImagesQ,TRUE指用戯定义图标。这里的l果是将ID_QTLOGO上的图标替换?span style="color: #000000;">UserImages.bmp</span>上的W一个图标?br><br><span style="color: #000000;">GetCmdMgr()</span><span style="color: #000000;">-></span><span style="color: #000000;">GetCmdImage()</span>可以Ҏ工具栏上图标的ID获取出已加蝲图标的烦引|<br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>     <span style="color: #000000;">m_mybar.ReplaceButton( ID_QTLOGO, CMFCToolBarButton(ID_QTLOGO, GetCmdMgr()</span><span style="color: #000000;">-></span><span style="color: #000000;">GetCmdImage(ID_PLUS), _T(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">)) );</span></div> q里工h上ID_QTLOGO的图标替换ؓID_PLUS按钮对应的图标?br><br>特别圎ͼ如果在你这些工hҎ改去但显C结果却没有改变的时候,你可以尝试删?<span style="color: red;">HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\$(你的E序?</span> q个键|当你重启E序后工h应该会按你的预想变化的。这是我在查资料时看到的Q当时没注意但后来发现挺有用的,出处没有记录下来?br><br>最后,ReplaceButtonq可以将按钮替换为其他控件?br><br> <ul> <li>其他...</li> </ul> 我在自定义工h上做了一个有效响应,里面使用静态成员函数CMFCToolBar::ResetAllImages()所有图标都清空了,此时会发现默认工h、自定义工具栏的图标都ؓI?br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> CMainFrame::OnQtLogo()<br></span><span style="color: #008080;"> 2</span> <span style="color: #000000;">{<br></span><span style="color: #008080;"> 3</span> <span style="color: #000000;">    CMFCToolBar::ResetAllImages();<br></span><span style="color: #008080;"> 4</span> <span style="color: #000000;"><br></span><span style="color: #008080;"> 5</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;">CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 6</span> <span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;"> 7</span> <span style="color: #000000;">    m_wndToolBar.LoadBitmap(IDB_BITMAP1);<br></span><span style="color: #008080;"> 8</span> <span style="color: #000000;">    m_mybar.LoadBitmap(IDR_MAINFRAME_256);<br></span><span style="color: #008080;"> 9</span> <span style="color: #000000;">    m_wndToolBar.RedrawWindow();<br></span><span style="color: #008080;">10</span> <span style="color: #000000;">    m_mybar.RedrawWindow();<br></span><span style="color: #008080;">11</span> <span style="color: #000000;">}</span></div> 更奇妙的是,后面我对两个工具栏重新加载了BMPQ而且加蝲的BMP资源是反了的Q此旉认工h上出C原来自定义工h?个图标,余下部分及自定义工具栏则为原来默认工h图标。可以想象,RestAllImages只是图标资源都释放了,工具栏资源依然健在,重新加蝲BMP的时候,工具栏图标就像一个个序排好的空_加蝲q来的BMP图标会出C前往后补位的现象?br>注意代码中,默认工具栏图标重新加载时使用的资源是IDR_MAINFRAME_256Q是默认的工h资源。也是_q里用LoadBitmap加蝲工具栏资源也是有效果的。这样应该可以说明工h在创建时LoadToolBar、LoadBitmap分别成功地加载了工具栏、BMP资源Q实际上是加载了两套图标资源Q这两者是序而非重合的,所以只昄原来的工h资源。要x定两者的重合关系Q只有在LoadToolBar的时候同时传入工h资源及BMP资源的ID?br><br><a href="http://www.shnenglu.com/Files/neverwinter/testtree.rar">Demo下蝲</a><br><br>———————————————————————————————————————————————————————————————?br>好吧Q终于写完了Q写得很仓促Q不的地方也很多,Ƣ迎指教Q?br> <img src ="http://www.shnenglu.com/neverwinter/aggbug/115984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/neverwinter/" target="_blank">nelson</a> 2010-05-20 23:53 <a href="http://www.shnenglu.com/neverwinter/archive/2010/05/20/115984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最q几天被MFC折腾~http://www.shnenglu.com/neverwinter/archive/2010/05/19/115853.htmlnelsonnelsonWed, 19 May 2010 15:22:00 GMThttp://www.shnenglu.com/neverwinter/archive/2010/05/19/115853.htmlhttp://www.shnenglu.com/neverwinter/comments/115853.htmlhttp://www.shnenglu.com/neverwinter/archive/2010/05/19/115853.html#Feedback12http://www.shnenglu.com/neverwinter/comments/commentRss/115853.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/115853.html
在进行设备树Q也是一个CTreeCtrl控gQ更C改的时候,遇到了一个比较bug的问题?br>
Z提供更好的用户体验,甲方希望讑֤树更C后滚动条位置能够保持与更新前一致。设备树的更新过E是q样的:更新消息来自Rimi的通知机制Q类g函数回调Q客L在收到消息之后调用Rimi的对象方法来获取新的讑֤树信息,然后更新树。乍看之下,要完成这个修改好像很单,只要更新前先记录滚动条的滚动位置Q更新后q原位置Q如果更新后滚动条滚动范围变化了q要微调一下位|,逻辑上来讲就q么几个步骤?br>
我一开始也是按照这L思\QGetScrollPos()获取当前滚动条的滚动位置Q然后更新树Q先删除所有节点再逐个dQ其他省?..Q,GetScrollRange()获得新的滚动范围Q最后SetScrollPos()旧的位|与滚动范围最大g最的一个设回去Q这里用到的ScrollBar是CTreeCtrl自动产生的,注意不是两个控gQ这里调用的函数都是CTreeCtrl的方法)。但实际效果是,树更新后滚动条滚到准的位置Q但树的视图C最Ӟ点击一下滚动条的那个方块才能回C前的位置。也是_滚动位置的更C树的视图分离了?br>
之后Q我一直以为是我控件的Ҏ用错了,对着MSDN和CSDNU结了很久。最后忍无可忍,自己写了个测试DemoQ里面就一DialogQ一CTreeCTrlQ树上随便加了些东西Q然后又一按键Q按键后会重新刷新树Q再滚动到原来的位置Q结果居然是对的Q视图跟着滚动条的位置变化了。ؓ了更好的模拟讑֤树节点增删的效果Q我在按键响应上又作了处理,按一下重h的时候会隐藏几个节点Q再按一下这些节ҎC出来,滚动位置按照客户端里面的一个处理方法,l果居然也是正确的。问题变得玄乎了Q?br>
无意间发现客L里面有个手动h讑֤树的快捷键,估计是当qpb做调试的时候留下来的。快捷键的响应直接调用更新树的函敎ͼ重刷后的昄Zh意料地是对的。比较一下两U更新方式的q程Q?br>
RimiQ?nbsp;  通知到来?gt;更新树(Rimi回调函数QRimi自己l护了一个线E池Q远E调用在被调用端的发赯都是Rimi自己的线E)
快捷键: 按键响应?gt;更新树(MFC消息处理函数Q?br>
更新树所用到的是同一个函敎ͼ但调用者却是不同的。因为Rimi用了boost::functionQ那我也在按键响应的时候对要调的函数用function来包装一下,造成两者在调用栈上调用的函数、顺序大部分是一致的Q只有最底层不同Q一ҎRimiQ一ҎMFC消息传递?br>
后来jianhao_以前在Rimi的回调函数里面调Rimi对象的方法出q问题,然后我又道回忆起之前zxb在Rimi函数Q还是对象方法)里面调system()也有问题?br>
N说RimiU程是“万恶之源”Q好吧,我把更新代码Ud另外一个线E里面,Rimi回调的时候唤醒更新线E,更新后视图还是不能跟着滚动位置变;快捷键的响应也修改一下,自己不作更新Q也是唤醒更新线E,q个Ҏ也变得不灵了Q囧Q这可以说明问题跟RimiU程无关?br>
N说线E调用才?#8220;万恶之源”Q把之前做的那个Demo改了一把,U程做刷斎ͼ按键响应只唤醒更新线E,果然不灵了!上网google了一把,关键?#8220;mfc U程 操作控g”Q首先映入眼帘的是《MFC中跨U程操作控g会不会出现像C#中的异常问题?》。这时候我也不兛_q个帖子的内容了Q线E操作控件有异常是吧Q那׃用线E做咯!q时候我才回惌vWIN32里面有自定义消息q玩意,MFC里面l定一个消息IDQON_MESSAGEl定一个处理函敎ͼPostMessage或SendMessage来发消息Q然后由WIN32自己的消息@环来调用处理函数Q这样应该是可以保证用非RimiU程来更新设备树的。再一ơ把Demo改了一把,按键响应Post一个自定义消息Q消息处理函数做hQ结果是对的Q再改,按键响应唤醒U程Q线E里面Post自定义消息,l果也是对的?br>
原以为是控g使用问题Q又以ؓ是Rimi不兼定w题,最后实质ؓMFC跨线E用控件的问题。其实我也不清楚q是不是真正的问题,毕竟我MFC既不懂又用得。That's all!

最后附上我的测试代?br>http://www.shnenglu.com/Files/neverwinter/testtree.rar


nelson 2010-05-19 23:22 发表评论
]]>
对象自杀http://www.shnenglu.com/neverwinter/archive/2009/10/26/99521.htmlnelsonnelsonMon, 26 Oct 2009 13:29:00 GMThttp://www.shnenglu.com/neverwinter/archive/2009/10/26/99521.htmlhttp://www.shnenglu.com/neverwinter/comments/99521.htmlhttp://www.shnenglu.com/neverwinter/archive/2009/10/26/99521.html#Feedback0http://www.shnenglu.com/neverwinter/comments/commentRss/99521.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/99521.html
W一个是自己设计的,对象持有定时器,自己l护生命周期?br>
W二个是无意中遇到的Q由于采用boost的线E库Q将成员函数变ؓU程用,最后在一堆调用之后居然把自己杀掉了?br>
很不q的是,在过E中都遇C相同的问题——堆栈挂掉了?br>
然后一轮定位,居然都是boost mutex的问题,scoped_lock很容易让人放松警惕?br>
void XXX()
{
    boost::recuisive_mutex::scoped_lock lk(m_mutex);

    

    YYYY();

    
}

void YYY()
{
    

    delete p;// 释放XXX所在对?br>
    
}

作ؓcL员的mutex没有被解锁,然后所在的cd被释放了Q这造成了堆栈挂掉?br>
对象自杀昄不是一U很好的风格Q还是尽量避免吧Q?br>


nelson 2009-10-26 21:29 发表评论
]]>
fstream改写文ghttp://www.shnenglu.com/neverwinter/archive/2009/09/14/96125.htmlnelsonnelsonMon, 14 Sep 2009 06:40:00 GMThttp://www.shnenglu.com/neverwinter/archive/2009/09/14/96125.htmlhttp://www.shnenglu.com/neverwinter/comments/96125.htmlhttp://www.shnenglu.com/neverwinter/archive/2009/09/14/96125.html#Feedback0http://www.shnenglu.com/neverwinter/comments/commentRss/96125.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/96125.html1.l一个一定大的I文件改写内容;
2.不能改变该空文g的大?br>
一开始是用ofstream做的Q但是每ơ一打开文gQ原来的I文件的大小改变了。之后用app方式打开Q但是每ơ的新数据都是追加到文gNQseekp无论如何不能到达实际文g的首部,q样文g大小变了,不符合需??br>
后来发现用fstreamQ采用in | out的方式来打开Q终于可以安全地改写文g了?br>


nelson 2009-09-14 14:40 发表评论
]]>
数组引用作函数模板的思?/title><link>http://www.shnenglu.com/neverwinter/archive/2009/09/14/96107.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 14 Sep 2009 04:26:00 GMT</pubDate><guid>http://www.shnenglu.com/neverwinter/archive/2009/09/14/96107.html</guid><wfw:comment>http://www.shnenglu.com/neverwinter/comments/96107.html</wfw:comment><comments>http://www.shnenglu.com/neverwinter/archive/2009/09/14/96107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/neverwinter/comments/commentRss/96107.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/neverwinter/services/trackbacks/96107.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"> 1</span> <span style="color: #000000;">#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;"> 2</span> <span style="color: #000000;"></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> std;<br></span><span style="color: #008080;"> 3</span> <span style="color: #000000;"><br></span><span style="color: #008080;"> 4</span> <span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> RefAsParam(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> (</span><span style="color: #000000;">&</span><span style="color: #000000;">aRR)[</span><span style="color: #000000;">5</span><span style="color: #000000;">])<br></span><span style="color: #008080;"> 5</span> <span style="color: #000000;">{<br></span><span style="color: #008080;"> 6</span> <span style="color: #000000;">    cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> aRR[</span><span style="color: #000000;">3</span><span style="color: #000000;">] </span><span style="color: #000000;"><<</span><span style="color: #000000;"> endl;<br></span><span style="color: #008080;"> 7</span> <span style="color: #000000;">}<br></span><span style="color: #008080;"> 8</span> <span style="color: #000000;"><br></span><span style="color: #008080;"> 9</span> <span style="color: #000000;">template </span><span style="color: #000000;"><</span><span style="color: #000000;"> size_t SZ </span><span style="color: #000000;">></span><span style="color: #000000;"><br></span><span style="color: #008080;">10</span> <span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> RefAsParamT(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> (</span><span style="color: #000000;">&</span><span style="color: #000000;">aRR)[SZ])<br></span><span style="color: #008080;">11</span> <span style="color: #000000;">{<br></span><span style="color: #008080;">12</span> <span style="color: #000000;">    cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> aRR[</span><span style="color: #000000;">0</span><span style="color: #000000;">] </span><span style="color: #000000;"><<</span><span style="color: #000000;"> endl;<br></span><span style="color: #008080;">13</span> <span style="color: #000000;">}<br></span><span style="color: #008080;">14</span> <span style="color: #000000;"><br></span><span style="color: #008080;">15</span> <span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main()<br></span><span style="color: #008080;">16</span> <span style="color: #000000;">{<br></span><span style="color: #008080;">17</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> a[</span><span style="color: #000000;">5</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;">, </span><span style="color: #000000;">4</span><span style="color: #000000;">, </span><span style="color: #000000;">5</span><span style="color: #000000;">};<br></span><span style="color: #008080;">18</span> <span style="color: #000000;"><br></span><span style="color: #008080;">19</span> <span style="color: #000000;">    RefAsParam( a );<br></span><span style="color: #008080;">20</span> <span style="color: #000000;"><br></span><span style="color: #008080;">21</span> <span style="color: #000000;">    RefAsParamT( a );<br></span><span style="color: #008080;">22</span> <span style="color: #000000;"><br></span><span style="color: #008080;">23</span> <span style="color: #000000;">    getchar();<br></span><span style="color: #008080;">24</span> <span style="color: #000000;">}</span></div> <br>q个是上ơ在某blog友回帖时有感写的一个例子程序?br><br>现在把目光放?span style="color: #000000;">RefAsParamT函数Q采用非cd模板的方?/span>使数l引用作为入参,乍看好像很爽Q不需要在函数定义时指定数l的大小Q比非模板方式的<span style="color: #000000;">RefAsParam</span>有极大的通用性?br><br>但是Q从模板生成的角度来看,对于不同的SZ׃产生不同?span style="color: #000000;">RefAsParamT<SZ>函数Q效率上说不q去Q虽说这些代码是~译器代替h手写的?br><br>再从数组引用作ؓ入参的角度看Q个为数l引用左入参的意义不大,特别是对于动态分配(newQ的数组Q这两个函数都无效?br><br>最后,STL中先闭后开的方式来指定数组范围Q这L通用性和效率都比较好?br><br>以上Q个人愚见!<br><br></span> <img src ="http://www.shnenglu.com/neverwinter/aggbug/96107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/neverwinter/" target="_blank">nelson</a> 2009-09-14 12:26 <a href="http://www.shnenglu.com/neverwinter/archive/2009/09/14/96107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ptime转换问题http://www.shnenglu.com/neverwinter/archive/2009/09/10/95806.htmlnelsonnelsonThu, 10 Sep 2009 07:30:00 GMThttp://www.shnenglu.com/neverwinter/archive/2009/09/10/95806.htmlhttp://www.shnenglu.com/neverwinter/comments/95806.htmlhttp://www.shnenglu.com/neverwinter/archive/2009/09/10/95806.html#Feedback1http://www.shnenglu.com/neverwinter/comments/commentRss/95806.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/95806.html 1 #include <boost/date_time/posix_time/posix_time.hpp>
 2 #include <boost/date_time/gregorian/gregorian.hpp>
 3 #include <iostream>
 4 #include <stdint.h>
 5 
 6 int main()
 7 {
 8     using namespace boost::posix_time;
 9     using namespace boost::gregorian;
10 
11     ptime ptNow( second_clock::local_time() );
12     std::cout << to_simple_string( ptNow ) << std::endl;
13 
14     tm tm1 = to_tm( ptNow );
15     time_t tt = mktime( &tm1 );
16 
17     tm* tm2 = localtime( &tt );
18 
19     ptime ptt = from_time_t( tt );
20     ptime pttm = ptime_from_tm( tm1 );
21     std::cout << to_simple_string( ptt ) << "\n" << to_simple_string( pttm ) << std::endl;
22 
23     return 0;
24 }

输出l果Q?br>2009-Sep-10 15:24:10
2009-Sep-10 07:24:10
2009-Sep-10 15:24:10

W一个ؓptime获得的当前时间的输出?br>W三个ؓptime转ؓtmQ再tm转成ptime的输?br>W二个ؓ那个tm转成time_tQtime_t再{回ptime的输出?br>
从结果看Q第二个输出的时间很诡异上居然差?个小ӞN是UTC旉Q但boost doc那里没有q个说明Q只是说用from_time_t可以time_t转成ptime。程序中间将time_t用localtime转回tm作验证,l果是正的?br>
诡异?#8230;…



nelson 2009-09-10 15:30 发表评论
]]>
拯构造函C赋值操作符重蝲http://www.shnenglu.com/neverwinter/archive/2009/09/08/95586.htmlnelsonnelsonTue, 08 Sep 2009 08:23:00 GMThttp://www.shnenglu.com/neverwinter/archive/2009/09/08/95586.htmlhttp://www.shnenglu.com/neverwinter/comments/95586.htmlhttp://www.shnenglu.com/neverwinter/archive/2009/09/08/95586.html#Feedback2http://www.shnenglu.com/neverwinter/comments/commentRss/95586.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/95586.html 1 #include <iostream>
 2 #include <string>
 3 
 4 class A
 5 {
 6 public:
 7     A( const std::string &str )
 8     {
 9         m_szS = str;
10     }
11 
12     A( const A &rhs )
13     {
14         m_szS = rhs.m_szS;
15     }
16 
17     A& operator= ( const A &rhs )
18     {
19         if ( this == &rhs )
20         {
21             return *this;
22         }
23 
24         m_szS = rhs.m_szS;
25         return *this;
26     }
27 
28     std::string m_szS;
29 };
30 
31 int main()
32 {
33     //!< 带参数基本构造,非explicit
34     A a1("SB");
35 
36     //!< 不能通过基本构造完成,实质上调用的是对a1的拷贝构?/span>
37     A a2 = a1;
38 
39     //!< 验证赋值操作符
40     A a3("SC");
41     a3 = a1; // here
42 
43     return 0;
44 }
45 
ȝQ?br>1.实例化一个对象的时候,如果用另一个已有对象对其进行赋|实质上调用的是拷贝构造函敎ͼ如上q的a2?br>2.对一个已实例化对象采用赋值操作符对其q行赋|调用的是赋值操作符重蝲的函敎ͼ如a3?br>
写得有点仓促Q如有不同意见,Ƣ迎拍板Q?br>


nelson 2009-09-08 16:23 发表评论
]]>
自己写的一个智能指?/title><link>http://www.shnenglu.com/neverwinter/archive/2009/08/21/94016.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Fri, 21 Aug 2009 05:00:00 GMT</pubDate><guid>http://www.shnenglu.com/neverwinter/archive/2009/08/21/94016.html</guid><wfw:comment>http://www.shnenglu.com/neverwinter/comments/94016.html</wfw:comment><comments>http://www.shnenglu.com/neverwinter/archive/2009/08/21/94016.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/neverwinter/comments/commentRss/94016.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/neverwinter/services/trackbacks/94016.html</trackback:ping><description><![CDATA[以下为智能指针的demo?br>设计思\为:通过一个引用计数的指针在多个auto_ptr<Type>中共享Type对象?br> <br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> auto_ptr.h</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 2</span> <span style="color: #008000;"></span><span style="color: #000000;">#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;"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> myspace<br></span><span style="color: #008080;"> 4</span> <span style="color: #000000;">{<br></span><span style="color: #008080;"> 5</span> <span style="color: #000000;">template </span><span style="color: #000000;"><</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> T</span><span style="color: #000000;">></span><span style="color: #000000;"><br></span><span style="color: #008080;"> 6</span> <span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> auto_ptr<br></span><span style="color: #008080;"> 7</span> <span style="color: #000000;">{<br></span><span style="color: #008080;"> 8</span> <span style="color: #000000;">    T </span><span style="color: #000000;">*</span><span style="color: #000000;">t; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 指针对象</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 9</span> <span style="color: #008000;"></span><span style="color: #000000;">    size_t </span><span style="color: #000000;">*</span><span style="color: #000000;">use; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 引用计数Q采用指针的方式是ؓ了方便多个auto_ptr的共?/span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span> <span style="color: #008000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">11</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;">!< 一般构造函?/span><span style="color: #008000;"><br></span><span style="color: #008080;">12</span> <span style="color: #008000;"></span><span style="color: #000000;">    auto_ptr(T </span><span style="color: #000000;">*</span><span style="color: #000000;">obj)<br></span><span style="color: #008080;">13</span> <span style="color: #000000;">    : t(obj) </span><span style="color: #008000;">//</span><span style="color: #008000;"> 接收指针</span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span> <span style="color: #008000;"></span><span style="color: #000000;">    , use(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> size_t(</span><span style="color: #000000;">1</span><span style="color: #000000;">)) </span><span style="color: #008000;">//</span><span style="color: #008000;"> 创徏引用计数</span><span style="color: #008000;"><br></span><span style="color: #008080;">15</span> <span style="color: #008000;"></span><span style="color: #000000;">    {<br></span><span style="color: #008080;">16</span> <span style="color: #000000;">    }<br></span><span style="color: #008080;">17</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;">!< 拯构造函?/span><span style="color: #008000;"><br></span><span style="color: #008080;">18</span> <span style="color: #008000;"></span><span style="color: #000000;">    auto_ptr(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> auto_ptr</span><span style="color: #000000;"><</span><span style="color: #000000;">T</span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #000000;">&</span><span style="color: #000000;">ptr)<br></span><span style="color: #008080;">19</span> <span style="color: #000000;">    : t(ptr.t)<br></span><span style="color: #008080;">20</span> <span style="color: #000000;">    , use(ptr.use)<br></span><span style="color: #008080;">21</span> <span style="color: #000000;">    {<br></span><span style="color: #008080;">22</span> <span style="color: #000000;">        </span><span style="color: #000000;">++*</span><span style="color: #000000;">(ptr.use); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 传递引用计数后Q计数?1</span><span style="color: #008000;"><br></span><span style="color: #008080;">23</span> <span style="color: #008000;"></span><span style="color: #000000;">    }<br></span><span style="color: #008080;">24</span> <span style="color: #000000;">    </span><span style="color: #000000;">~</span><span style="color: #000000;">auto_ptr()<br></span><span style="color: #008080;">25</span> <span style="color: #000000;">    {<br></span><span style="color: #008080;">26</span> <span style="color: #000000;">        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 每次析构的时候,如果计数gؓ0则删除对?/span><span style="color: #008000;"><br></span><span style="color: #008080;">27</span> <span style="color: #008000;"></span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">--*</span><span style="color: #000000;">use </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">28</span> <span style="color: #000000;">        {<br></span><span style="color: #008080;">29</span> <span style="color: #000000;">            delete t;<br></span><span style="color: #008080;">30</span> <span style="color: #000000;">            delete use;<br></span><span style="color: #008080;">31</span> <span style="color: #000000;">        }<br></span><span style="color: #008080;">32</span> <span style="color: #000000;">    }<br></span><span style="color: #008080;">33</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;">!< ->操作W重?/span><span style="color: #008000;"><br></span><span style="color: #008080;">34</span> <span style="color: #008000;"></span><span style="color: #000000;">    T</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-></span><span style="color: #000000;"> () </span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br></span><span style="color: #008080;">35</span> <span style="color: #000000;">    {<br></span><span style="color: #008080;">36</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> t;<br></span><span style="color: #008080;">37</span> <span style="color: #000000;">    }<br></span><span style="color: #008080;">38</span> <span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;">!< *操作W重载,q回指针对象的引?/span><span style="color: #008000;"><br></span><span style="color: #008080;">39</span> <span style="color: #008000;"></span><span style="color: #000000;">    T</span><span style="color: #000000;">&</span><span style="color: #000000;"> </span><span style="color: #0000ff;">operator</span><span style="color: #000000;">*</span><span style="color: #000000;"> () </span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br></span><span style="color: #008080;">40</span> <span style="color: #000000;">    {<br></span><span style="color: #008080;">41</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">t;<br></span><span style="color: #008080;">42</span> <span style="color: #000000;">    }<br></span><span style="color: #008080;">43</span> <span style="color: #000000;">};<br></span><span style="color: #008080;">44</span> <span style="color: #000000;"><br></span><span style="color: #008080;">45</span> <span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">!< 输出,采用?操作W,所以不需要设为friend</span><span style="color: #008000;"><br></span><span style="color: #008080;">46</span> <span style="color: #008000;"></span><span style="color: #000000;">template </span><span style="color: #000000;"><</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Type</span><span style="color: #000000;">></span><span style="color: #000000;"><br></span><span style="color: #008080;">47</span> <span style="color: #000000;">std::ostream</span><span style="color: #000000;">&</span><span style="color: #000000;"> </span><span style="color: #0000ff;">operator</span><span style="color: #000000;"><<</span><span style="color: #000000;"> (std::ostream </span><span style="color: #000000;">&</span><span style="color: #000000;">os, auto_ptr</span><span style="color: #000000;"><</span><span style="color: #000000;">Type</span><span style="color: #000000;">></span><span style="color: #000000;"> ptr)<br></span><span style="color: #008080;">48</span> <span style="color: #000000;">{<br></span><span style="color: #008080;">49</span> <span style="color: #000000;">    os </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">ptr;<br></span><span style="color: #008080;">50</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> os;<br></span><span style="color: #008080;">51</span> <span style="color: #000000;">}<br></span><span style="color: #008080;">52</span> <span style="color: #000000;">}</span><span style="color: #008000;">//</span><span style="color: #008000;">end of myspace<br></span><span style="color: #008080;">53</span> <span style="color: #008000;"> <br></span><span style="color: #008080;">54</span> <span style="color: #008000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"> main.cpp</span><span style="color: #008000;"><br></span><span style="color: #008080;">55</span> <span style="color: #008000;"></span><span style="color: #000000;">#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;">56</span> <span style="color: #000000;">#include </span><span style="color: #000000;">"</span><span style="color: #000000;">auto_ptr.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;">57</span> <span style="color: #000000;">#ifdef _DEBUG<br></span><span style="color: #008080;">58</span> <span style="color: #000000;"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;"> new new (_NORMAL_BLOCK, __FILE__, __LINE__)</span><span style="color: #000000;"><br></span><span style="color: #008080;">59</span> <span style="color: #000000;"></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br></span><span style="color: #008080;">60</span> <span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> main(</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;">61</span> <span style="color: #000000;">{<br></span><span style="color: #008080;">62</span> <span style="color: #000000;">    myspace::auto_ptr</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;"> iptr(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;">(</span><span style="color: #000000;">9</span><span style="color: #000000;">)) ;<br></span><span style="color: #008080;">63</span> <span style="color: #000000;">    std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> iptr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> std::endl;<br></span><span style="color: #008080;">64</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;">iptr;<br></span><span style="color: #008080;">65</span> <span style="color: #000000;">    std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> iptr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> std::endl;<br></span><span style="color: #008080;">66</span> <span style="color: #000000;">    (</span><span style="color: #000000;">*</span><span style="color: #000000;">iptr) </span><span style="color: #000000;">--</span><span style="color: #000000;">;<br></span><span style="color: #008080;">67</span> <span style="color: #000000;">    std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> iptr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> std::endl;<br></span><span style="color: #008080;">68</span> <span style="color: #000000;">    getchar();<br></span><span style="color: #008080;">69</span> <span style="color: #000000;">    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">70</span> <span style="color: #000000;">}<br></span><span style="color: #008080;">71</span> <span style="color: #000000;"> </span></div> <br>从上面的Demo中,可以看到q个指针的缺点:<br>每次创徏指针的时候,传入的指针是对外暴露的,采用new的方式作为入参才能保证安全的。如果这个new出来的对象(如上面的intQ?Q)在别处被delete了,l箋使用q个指针相当于用一个野指针。这L问题即便是boost的share_ptr也是会有的?br><img src ="http://www.shnenglu.com/neverwinter/aggbug/94016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/neverwinter/" target="_blank">nelson</a> 2009-08-21 13:00 <a href="http://www.shnenglu.com/neverwinter/archive/2009/08/21/94016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Member Initialization listQ成员初始化表)http://www.shnenglu.com/neverwinter/archive/2009/08/19/93809.htmlnelsonnelsonWed, 19 Aug 2009 04:26:00 GMThttp://www.shnenglu.com/neverwinter/archive/2009/08/19/93809.htmlhttp://www.shnenglu.com/neverwinter/comments/93809.htmlhttp://www.shnenglu.com/neverwinter/archive/2009/08/19/93809.html#Feedback0http://www.shnenglu.com/neverwinter/comments/commentRss/93809.htmlhttp://www.shnenglu.com/neverwinter/services/trackbacks/93809.html    q一份是我写的,所以就发布出来啦!~这个还写得比较详l吧Q?br> 

Chapter One - 调用构造函数对成员变量q行构造、初始化
 
    在类构造的时候,对于cL员变量的构造貌似可以在构造函C完成Q那Z么还需要成员初始化表呢Q?br>    我们来看看这L情况Q?br> 
 1 /* programme 1 */
 2 class Base
 3 {
 4 public:
 5     Base(int val)
 6     : i(val) //q里Z么要攑֜成员初始化表呢?
 7     {
 8      //i = val??
 9     }
10     ~Base(){}
11 
12 private:
13     int i;
14 };
15 
16 class UseBase
17 {
18     Base b;
19 public:
20     UseBase(){} //没有用Base的构造函?/span>
21     ~UseBase(){}
22 };
23 
24 int main()
25 {
26     return 0;
27 };
28 /* end of programme 1 */

    E序出现q样的错误:error C2512: 'Base' : no appropriate default constructor availableQ在UseBase中Base没有被合理地初始化?br> 
 1 /* programme 2 */
 2 
 3 //
 4 
 5 class UseBase
 6 {
 7     Base b;
 8 public:
 9     UseBase() : b(0){} //可以~译通过
10     ~UseBase(){}
11 };
12 
13 //
14 
15 /* end of programme 2 */

 
    由此可以看出成员初始化列表的一个要点,调用构造函数对成员变量q行构造、初始化。对于内|成员变?int、double{等Q个人理解ؓC语言中就已经有的cdQ详l信息参见Primer)而言没有明显的问题,但对于非内置成员变量而言Q即便编E者没有在成员初始化表中显C用构造函敎ͼ~译器也会隐式地调用默认构造函数。所?#8220;默认构造函?#8221;是?$classname$(void)"q样的Ş式。上面的例子是因ؓq个原因而编译失败的QBase没有提供默认构造函数。也是_需要特D构造的cdd成员初始化列表进行构造、初始化?br> 
    而如果有默认构造函敎ͼ是否可以在成员初始化表中置之不理呢Q答案是否定的,q涉及到效率问题。(以下E序可以中的Base完全可以用stringcd来取代,但ؓ了方便调试方式查看,所以重新编写了Base。)
 
 1 /* programme 3 */
 2  
 3 class Base
 4 {
 5 public:
 6     Base(void)
 7     : i(0)
 8     {
 9     // breakpoint 1
10     }
11     // 赋值操作符重蝲
12     Base& operator= ( const int val )
13     {
14         i = val;// breakpoint 2
15         return *this;
16     }
17 
18     ~Base(){}
19 
20 private:
21     int i;
22 };
23 class UseBase
24 {
25     Base b;
26 public:
27     UseBase()
28     //: b(0)
29     {
30         b = 3;// breakpoint 3
31     }
32     ~UseBase(){}
33 };
34 
35 int main()
36 {
37     UseBase ub;
38     return 0;
39 };
40 /* end of programme 3 */

    breakpoint的顺序ؓ1-3-2Q这说明UseBase中的Base既进行了默认构造,之后又进行了赋|原本可以通过一个构造函数完成的操作Q现在分成了两个步骤Q效率降低了?br> 

Chapter Two - zcȝ成员初始化表
 
    在派生类的成员初始化表中Q可以调用基cȝ构造函数来初始化其基类成分?br> 
 1 /* programme 4 */
 2 #include <iostream>
 3 using namespace std;
 4 class Base
 5 {
 6 public:
 7     Base( const int val )
 8     : i(val)
 9     {
10     }
11 
12     Base& operator= ( const int val )
13     {
14         i = val;
15         return *this;
16     }
17 
18     virtual ~Base(){}
19 
20     void print() const
21     {
22         cout << "val: " << i << endl;
23     }
24 
25 private:
26     int i;
27 };
28 
29 class Derived : public Base
30 {
31 public:
32     Derived( const int val )
33     : Base(val)
34     {}
35 };
36 
37 int main()
38 {
39     Derived d(1);
40     d.print();
41     getchar();
42     return 0;
43 };
44 /* end of programme 4 */

    一个小错误Q很多h可能会犯的:
 1 /* programme 5 */
 2 //
 3 
 4 class Derived : public Base
 5 {
 6 public:
 7     Derived( const int val )
 8     //: Base(val)
 9     {
10         Base(val);
11     }
12 };
13 
14 //
15 /* end of programme 5 */
 
    在构造函C内直接调用基cȝ构造函敎ͼ但这h不能完成对基cL分的初始化的。这个语句的意义是创Z个时的Base对象?br> 
 
Chapter Three - 初始化const、引用成?/span>
 
    利用成员初始化表能够初始化const、引用成员,q在构造函C内是无法做到的。因Z般情况下Qconst、引用的对象在声明的时候就要同时将值或对象l定C赗?br> 
 1 /* programme 6 */
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5 class dummy
 6 {
 7     const int ci;
 8     string& szStr;
 9 
10 public:
11     dummy(const int i, string &sz)
12     : ci(i)
13     , szStr(sz)
14     {}
15 
16     void printi()
17     {
18         cout << "const int: " << ci << endl;
19     }
20 
21     void printsz()
22     {
23         cout << "string&: " << szStr << endl;
24     }
25 
26     void setsz(string &sz)
27     {
28         szStr = sz;
29     }
30 };
31 
32 int main()
33 {
34     string _4ref("hello");
35     dummy d(10, _4ref);
36     d.printi();
37     d.printsz();
38     cout << endl;
39     d.setsz( string("goodbye") );
40     d.printsz();
41     cout << "_4ref: " << _4ref << endl;
42     getchar();
43     return 0;
44 };
45 /* end of programme 6 */

输出l果
const int: 10
string&: hello

string&: goodbye
_4ref: goodbye


nelson 2009-08-19 12:26 发表评论
]]>
一个“过度设计”的四则q算?/title><link>http://www.shnenglu.com/neverwinter/archive/2009/08/18/93741.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Tue, 18 Aug 2009 15:01:00 GMT</pubDate><guid>http://www.shnenglu.com/neverwinter/archive/2009/08/18/93741.html</guid><wfw:comment>http://www.shnenglu.com/neverwinter/comments/93741.html</wfw:comment><comments>http://www.shnenglu.com/neverwinter/archive/2009/08/18/93741.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/neverwinter/comments/commentRss/93741.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/neverwinter/services/trackbacks/93741.html</trackback:ping><description><![CDATA[看了Primer的TextQuery的例子,又动手copy了一遍,对于q样华丽的设计激动得久久不能自已?br><br>前几天,按照q个例子Q自己封装了一套四则运表辑ּc,重现了一下这L设计模式?br><br><img alt="" src="http://www.shnenglu.com/images/cppblog_com/neverwinter/expr.jpg" align="left" height="285" width="600"><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>然后Q做了一个parser来解析表辑ּQ不q做得很搓,stringstream对于括号的读取有问题……不过主要功能已经基本实现了?br><br>C传代码:<br><a href="http://www.shnenglu.com/Files/neverwinter/Expression.zip">http://www.shnenglu.com/Files/neverwinter/Expression.zip</a><br><br>环境是vs2008 SP1Q里面用Cboost的shared_ptr?br><br>parser的设计实在太烂,如果有什么高见请指教一下!?br><br>PSQ看到别人用boost::spirit来做同样的表辑ּ分析计算Q居?0多行代码完实CQ还包括提示信息Q。可见,boost的潜力是十分大的Q以后一定要好好学习、挖掘一下?br><br><img src ="http://www.shnenglu.com/neverwinter/aggbug/93741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/neverwinter/" target="_blank">nelson</a> 2009-08-18 23:01 <a href="http://www.shnenglu.com/neverwinter/archive/2009/08/18/93741.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.dnsdna.cn" target="_blank">þۺƵվ</a>| <a href="http://www.weijulian.cn" target="_blank">Ʒþþþav</a>| <a href="http://www.vod1314.cn" target="_blank">Ʒþøһ</a>| <a href="http://www.sc-cits.com.cn" target="_blank">þɫۺϼ</a>| <a href="http://www.ichz.cn" target="_blank">Ʒ޾þþþþ</a>| <a href="http://www.fzcxpc.cn" target="_blank">һaƬþëƬ16</a>| <a href="http://www.mayray.com.cn" target="_blank">99ƷȾþ޶</a>| <a href="http://www.tuht.cn" target="_blank">þþƷձҰ</a>| <a href="http://www.rvyq.cn" target="_blank">þþŷղ</a>| <a href="http://www.t421.cn" target="_blank">þۺϸþúݺ97ɫ</a>| <a href="http://www.39xw.cn" target="_blank">99þ99þþƷѿ</a>| <a href="http://www.5icsw.cn" target="_blank">91Ʒþþþþ</a>| <a href="http://www.dwhpg.com.cn" target="_blank">þۺϾɫۺϾƷ</a>| <a href="http://www.paysearch.cn" target="_blank">Ʒþþþþù</a>| <a href="http://www.37photo.com.cn" target="_blank">þþþƷƵѹۿ</a>| <a href="http://www.y6smog.cn" target="_blank">ŷƷž99þڹۿ</a>| <a href="http://www.dztd.gd.cn" target="_blank">þ99ֻоƷ66</a>| <a href="http://www.taoke140.cn" target="_blank">þþƷ</a>| <a href="http://www.z8990.cn" target="_blank">Ʒ99þþƷ</a>| <a href="http://www.yx177.cn" target="_blank">þҹۺϾþ</a>| <a href="http://www.t55n3z.cn" target="_blank">ɫɫۺϾþҹҹ</a>| <a href="http://www.eurocake.com.cn" target="_blank">þþƷ99Ʒ</a>| <a href="http://www.d4ycf2r.cn" target="_blank">þþþùһëƬ</a>| <a href="http://www.bttzc.cn" target="_blank">޾þһ </a>| <a href="http://www.xin-qi.com.cn" target="_blank">ھƷþۺ88</a>| <a href="http://www.lskcop.cn" target="_blank">þþþѾƷ</a>| <a href="http://www.sooppp.cn" target="_blank">97þþƷҹһ</a>| <a href="http://www.vfmg.cn" target="_blank">þþþù</a>| <a href="http://www.lidonsj.cn" target="_blank">þþƷ</a>| <a href="http://www.521mz.cn" target="_blank">޹þþۺվ </a>| <a href="http://www.xinkecheng.net.cn" target="_blank">þþƷ72</a>| <a href="http://www.zjzengyun.cn" target="_blank">97㽶þҹɫƷ</a>| <a href="http://www.ghzu.cn" target="_blank">þ99Ʒ鶹լլ</a>| <a href="http://www.sphjw.cn" target="_blank">һþۺ³³ŷһ </a>| <a href="http://www.7788797.cn" target="_blank">ۺϾþþ</a>| <a href="http://www.meloful.cn" target="_blank">þþþþþƷ</a>| <a href="http://www.tianyacity.cn" target="_blank">˾þü91</a>| <a href="http://www.emitel.cn" target="_blank">þþþþùƷŮ</a>| <a href="http://www.bestlevering.cn" target="_blank">߳߳þþ91 </a>| <a href="http://www.lar6ge.cn" target="_blank">þҹɫƷ鶹</a>| <a href="http://www.dghaishi.com.cn" target="_blank">Ʒ99þò</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>