﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-一步一个脚印，走在自己前面！-随笔分类-CC++ Programming</title><link>http://www.cppblog.com/zerolee/category/3015.html</link><description>想想自己5年后会是什么样子……</description><language>zh-cn</language><lastBuildDate>Mon, 19 Sep 2011 20:06:07 GMT</lastBuildDate><pubDate>Mon, 19 Sep 2011 20:06:07 GMT</pubDate><ttl>60</ttl><item><title>Inside The C++ Object Model 阅读笔记</title><link>http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Mon, 19 Sep 2011 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/156211.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/156211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/156211.html</trackback:ping><description><![CDATA[1. The semantics of construction<br />有4种情况会导致&#8220;编译器必须为未声明constructor之classes合成一个default constructor&#8220;。C++ 标准把那些合成物称为implicit nontrivial default constructors。被合成出来的constructor只能满足编译器(而非程序)的需要。它之所以能够完成任务，是借着&#8220;调用member object 或 base class 的default constructor&#8220; 或是 &#8221;为每一个object初始化其virtual function 机制或virtual base class机制&#8220;而完成。至于没有存在那四种情况而又没有声明任何constructor的classes，我们说它们拥有的是implicit trivial default constructors，它们实际上并不会被合成出来。<br />在合成出来的default constructor中，只有base class subobjects 和member class objects会被初始化。所有其它的nonstatic data memeber，如整数、整数指针、整数数组等等都不会被初始化。这些初始化操作对程序而言或许有需要，但对编译器则并非必要。<br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/zerolee/aggbug/156211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-09-19 13:18 <a href="http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可行的方法模仿goto功能</title><link>http://www.cppblog.com/zerolee/archive/2011/03/23/142561.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Wed, 23 Mar 2011 04:27:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/03/23/142561.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/142561.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/03/23/142561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/142561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/142561.html</trackback:ping><description><![CDATA[采用适当的代码结构可以模仿goto的功能: 从同一个地方立即跳转到另一个地方<br>代码片段如下:<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>&nbsp;<span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;{<br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(condition1)&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br></span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(condition2)&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br></span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div>
<br><br> <img src ="http://www.cppblog.com/zerolee/aggbug/142561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-03-23 12:27 <a href="http://www.cppblog.com/zerolee/archive/2011/03/23/142561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)C++中extern “C”含义深层探索</title><link>http://www.cppblog.com/zerolee/archive/2011/03/17/142064.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Thu, 17 Mar 2011 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/03/17/142064.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/142064.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/03/17/142064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/142064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/142064.html</trackback:ping><description><![CDATA[<p>(转)C++中extern &#8220;C&#8221;含义深层探索<br>&nbsp;<br>&nbsp;<br>1.引言</p>
<p>　　C++语言的创建初衷是&#8220;a better
C&#8221;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程
式语言的特点（被世人称为&#8220;不彻底地面向对象&#8221;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支
持函数的重载，C++对全局函数的处理方式与C有明显的不同。<br>　　2.从标准头文件说起</p>
<p>　　某企业曾经给出如下的一道面试题：</p>
<p>　　面试题<br>　　为什么标准头文件都有类似以下的结构？ </p>
<p>&nbsp;</p>
<p><br>#ifndef __INCvxWorksh<br>#define __INCvxWorksh <br>#ifdef __cplusplus<br>extern "C" {<br>#endif <br>/*...*/ <br>#ifdef __cplusplus<br>}<br>#endif <br>#endif /* __INCvxWorksh */</p>
<p><br>　　分析<br>　　显然，头文件中的编译宏&#8220;#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif&#8221; 的作用是防止该头文件被重复引用。</p>
<p>　　那么</p>
<p>#ifdef __cplusplus<br>extern "C" {<br>#endif <br>#ifdef __cplusplus<br>}<br>#endif </p>
<p><br>　　的作用又是什么呢？我们将在下文一一道来。<br>&nbsp;<br>　　3.深层揭密extern "C"</p>
<p>　　extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是&#8220;extern&#8221;的；其次，被它修饰的目标是&#8220;C&#8221;的。让我们来详细解读这两重含义。</p>
<p>　　被extern "C"限定的函数或变量是extern类型的；</p>
<p>　　extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：</p>
<p>　　extern int a;</p>
<p><br>　　仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。</p>
<p>　　通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变
量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从
模块A编译生成的目标代码中找到此函数。</p>
<p>　　与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern &#8220;C&#8221;修饰。</p>
<p>　　被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；</p>
<p>　　未加extern &#8220;C&#8221;声明时的编译方式</p>
<p>　　首先看看C++中对类似C的函数是怎样编译的。</p>
<p>　　作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为： </p>
<p>void foo( int x, int y );</p>
<p><br>　　该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为&#8220;mangled name&#8221;）。</p>
<p>　　_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数
void foo( int x, int y )与void foo( int x, float y
)编译生成的符号是不相同的，后者为_foo_int_float。<br>　　同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。
用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二
的名字，这个名字与用户程序中同名的全局变量名字不同。</p>
<p>　　未加extern "C"声明时的连接方式</p>
<p>　　假设在C++中，模块A的头文件如下：</p>
<p>// 模块A头文件　moduleA.h<br>#ifndef MODULE_A_H<br>#define MODULE_A_H<br>int foo( int x, int y );<br>#endif</p>
<p><br>　　在模块B中引用该函数：</p>
<p>// 模块B实现文件　moduleB.cpp<br>#include "moduleA.h"<br>foo(2,3);</p>
<p><br>　　实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！</p>
<p>　　加extern "C"声明后的编译和连接方式</p>
<p>　　加extern "C"声明后，模块A的头文件变为：</p>
<p>// 模块A头文件　moduleA.h<br>#ifndef MODULE_A_H<br>#define MODULE_A_H<br>extern "C" int foo( int x, int y );<br>#endif</p>
<p><br>　　在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：</p>
<p>　　（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；</p>
<p>　　（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。</p>
<p>　　如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。</p>
<p>　　所以，可以用一句话概括extern
&#8220;C&#8221;这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么
做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：<br>　　实现C++与C及其它语言的混合编程。<br>　　明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。<br>　　4.extern "C"的惯用法</p>
<p>　　（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：</p>
<p>extern "C"<br>{<br>#include "cExample.h"<br>}</p>
<p><br>　　而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。</p>
<p>　　笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：</p>
<p>/* c语言头文件：cExample.h */<br>#ifndef C_EXAMPLE_H<br>#define C_EXAMPLE_H<br>extern int add(int x,int y);&nbsp;&nbsp; // "extern" is optional [Zero]<br>#endif<br>/* c语言实现文件：cExample.c */<br>#include "cExample.h"<br>int add( int x, int y )<br>{<br>return x + y;<br>}<br>// c++实现文件，调用add：cppFile.cpp</p>
<p>/*</p>
<p>[Zero] below, can be written as <br></p>
<p>extern "C" int add(int,int); <br></p>
<p>#include "cExample.h"</p>
<p>*/</p>
<p>extern "C"&nbsp; <br>{<br>#include "cExample.h"<br>}<br>int main(int argc, char* argv[])<br>{<br>add(2,3); <br>return 0;<br>}</p>
<p><br>　　如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。</p>
<p>　　（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。<br>　　笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：</p>
<p>//C++头文件 cppExample.h<br>#ifndef CPP_EXAMPLE_H<br>#define CPP_EXAMPLE_H<br>extern "C" int add( int x, int y );<br>#endif<br>//C++实现文件 cppExample.cpp<br>#include "cppExample.h"<br>int add( int x, int y )<br>{<br>return x + y;<br>}<br>/* C实现文件 cFile.c<br>/* 这样会编译出错：#include "cExample.h" */<br>extern int add( int x, int y );<br>int main( int argc, char* argv[] )<br>{<br>add( 2, 3 ); <br>return 0;<br>}</p>
<br>　　如果深入理解了第3节中所阐述的extern "C"在编译和连接阶段发挥的作用，就能真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对第4节给出的示例代码，需要特别留意各个细节。 <img src ="http://www.cppblog.com/zerolee/aggbug/142064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-03-17 17:20 <a href="http://www.cppblog.com/zerolee/archive/2011/03/17/142064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构造函数，拷贝构造，拷贝赋值</title><link>http://www.cppblog.com/zerolee/archive/2010/12/03/135351.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Fri, 03 Dec 2010 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2010/12/03/135351.html</guid><description><![CDATA[Example1：<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;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A&nbsp;{<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A()&nbsp;{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A.ctor()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;other)&nbsp;{<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A.copyctor()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;other)&nbsp;{<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A.op&nbsp;=()&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AA&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;A<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA()&nbsp;{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AA.ctor()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA&nbsp;aa;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;A.ctor&nbsp;=&gt;&nbsp;AA.ctor</span><span style="color: #008000;"><br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA&nbsp;bb(aa);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;A.copyctor</span><span style="color: #008000;"><br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;aa&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bb;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;A.op&nbsp;=</span><span style="color: #008000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"></span></div>
1. 编译器会默认调用基类的构造函数。<br>2. 继承类的拷贝构造函数/拷贝赋值运算符函数没有定义，编译器会默认调用基类相应的函数。<br><br>Example2:<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;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A&nbsp;{<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A()&nbsp;{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A.ctor()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;other)&nbsp;{<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A.copyctor()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;other)&nbsp;{<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A.op&nbsp;=()&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AA&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;A<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA()&nbsp;{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AA.ctor()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;AA</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;other)<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;A(other)&nbsp;{<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AA.copyctor()&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;AA</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;other)&nbsp;{<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AA.op&nbsp;=()</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA&nbsp;aa;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;A.ctor&nbsp;=&gt;&nbsp;AA.ctor</span><span style="color: #008000;"><br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;AA&nbsp;bb(aa);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;A.copyctor&nbsp;=&gt;&nbsp;AA.copyctor</span><span style="color: #008000;"><br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;aa&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bb;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;AA.op&nbsp;=</span><span style="color: #008000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">}</span></div>
1. 拷贝构造函数会默认调用基类的构造函数，而不是对应的拷贝构造函数，除非在自己手动调用。<br>2. 自定义的拷贝赋值运算符函数，也不会调用基类的相应函数。<br><br><br><img src ="http://www.cppblog.com/zerolee/aggbug/135351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2010-12-03 15:21 <a href="http://www.cppblog.com/zerolee/archive/2010/12/03/135351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Life scope of one object example</title><link>http://www.cppblog.com/zerolee/archive/2010/12/03/135349.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Fri, 03 Dec 2010 06:48:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2010/12/03/135349.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/135349.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2010/12/03/135349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/135349.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/135349.html</trackback:ping><description><![CDATA[Example code:<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;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A&nbsp;{<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">!=</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;a;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.at(</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ctor&nbsp;ok.</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">A()&nbsp;{<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">A:dtor.</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;f()<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.</span><span style="color: #000000;">~</span><span style="color: #000000;">A();<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a)&nbsp;A(</span><span style="color: #000000;">2</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;here,&nbsp;throw&nbsp;one&nbsp;exception,&nbsp;but&nbsp;still&nbsp;destroy&nbsp;a&nbsp;again&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(<img src="http://www.cppblog.com/Images/dot.gif">)&nbsp;{<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">catch&nbsp;exception.</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"></span></div>
<br>Above code snippet, if in placement new call, constructor of one class throws one exception, that a will still be destroyed again, since a is one automatic object, according to Cpp standard. In this case, one object constructed once, but destroyed twice, undefined/unpredicated behavior may happen.<br><br><br><img src ="http://www.cppblog.com/zerolee/aggbug/135349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2010-12-03 14:48 <a href="http://www.cppblog.com/zerolee/archive/2010/12/03/135349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>One new template implementation of single linked list</title><link>http://www.cppblog.com/zerolee/archive/2010/10/17/130198.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 17 Oct 2010 06:26:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2010/10/17/130198.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/130198.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2010/10/17/130198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/130198.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/130198.html</trackback:ping><description><![CDATA[One new implementation of single list as below(code: c++):<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;">/**<br>&nbsp; * Used to create and manage a single linked list of objects of a common<br>&nbsp; * type.&nbsp; The list of created objects can be examined to find a key by<br>&nbsp; * an identifier.<br>&nbsp; */<br>&nbsp;1</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T,&nbsp;typename&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;objList&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;objFirst;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;objNext;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;K&nbsp;objKey;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;objList(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;K&nbsp;key)&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;key;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objNext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;objFirst;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objFirst&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(T</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;getObject(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;K</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;key);<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">};&nbsp;<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T,&nbsp;typename&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;objList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T,&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::objFirst&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T,&nbsp;typename&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">objList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T,&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::getObject(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;K</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;key)<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;objList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T,&nbsp;K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::objFirst;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(obj)&nbsp;{<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(key</span><span style="color: #000000;">==</span><span style="color: #000000;">obj</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">objKey)<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">objNext;<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;obj;<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">}</span></div>
<br><br> <img src ="http://www.cppblog.com/zerolee/aggbug/130198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2010-10-17 14:26 <a href="http://www.cppblog.com/zerolee/archive/2010/10/17/130198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt GUI Programming Basic</title><link>http://www.cppblog.com/zerolee/archive/2007/05/21/24538.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Mon, 21 May 2007 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/05/21/24538.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/24538.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/05/21/24538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/24538.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/24538.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Qt GUI programming basic&nbsp;&nbsp;<a href='http://www.cppblog.com/zerolee/archive/2007/05/21/24538.html'>阅读全文</a><img src ="http://www.cppblog.com/zerolee/aggbug/24538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-05-21 16:14 <a href="http://www.cppblog.com/zerolee/archive/2007/05/21/24538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DLL编程专题</title><link>http://www.cppblog.com/zerolee/archive/2007/05/20/24430.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 20 May 2007 03:32:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/05/20/24430.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/24430.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/05/20/24430.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/24430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/24430.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DLL编程专题。&nbsp;&nbsp;<a href='http://www.cppblog.com/zerolee/archive/2007/05/20/24430.html'>阅读全文</a><img src ="http://www.cppblog.com/zerolee/aggbug/24430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-05-20 11:32 <a href="http://www.cppblog.com/zerolee/archive/2007/05/20/24430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> sizeof操作符使用注意</title><link>http://www.cppblog.com/zerolee/archive/2007/05/19/24393.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sat, 19 May 2007 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/05/19/24393.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/24393.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/05/19/24393.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/24393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/24393.html</trackback:ping><description><![CDATA[&nbsp;sizeof操作符使用注意：<br>
<p><br>&nbsp;先看下面的测试代码(1)和(2)：<br>&nbsp;=====================================================================</p>
<span>
<p>测试代码(1) :&nbsp; <span><br>const char* a[] = { "a", "bcedf" };</span></p>
<p align=left><span>// </span><span>测试下面的</span><span>sizeof(a)</span><span>，它的结果是</span><span>&#8217;8&#8217;, </span><span>原因在于</span><span>a</span><span>是指针数组，里面存储的是指针元素。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>// </span><span>在这里是两个指针元素的数组。故为</span><span>4*2=8.</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; sizeof(a) &lt;&lt; endl;&nbsp;// print '8'</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>// test sizeof(*a), sizeof(a[0]), sizeof(a[0][0])</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; sizeof(*a) &lt;&lt; endl;&nbsp;// print '4'&nbsp;</span><span>这里</span><span>*a</span><span>是求出第一个字符串的地址</span><span>,</span><span>注意</span><span>a</span><span>是指针的指针。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; sizeof(a[0]) &lt;&lt; endl;// print '4'&nbsp;</span><span>这里是</span><span>a[0] = *a,</span><span>跟上面的一样。</span></p>
<p>&nbsp;&nbsp;&nbsp; cout &lt;&lt; sizeof(a[0][0]) &lt;&lt; endl; // print '1' <span style="COLOR: red">这里是第一个字符串的第一个字符a，一个字节。<br></span><br>测试代码(2) :<br>struct TestStruct {<br>&nbsp; &nbsp;char c_elem;&nbsp;// 1 bytes<br>&nbsp;&nbsp; int int_elem;&nbsp;// 4 bytes<br>&nbsp;};</p>
<p><span>&nbsp;cout &lt;&lt; sizeof(TestStruct) &lt;&lt; endl;&nbsp;&nbsp;&nbsp;&nbsp; // it prints '8' .<br>&nbsp;<br>struct TestStruct1 {<br>&nbsp;&nbsp;&nbsp; char c_elem1;<br>&nbsp;&nbsp;&nbsp; char c_elem2:<br>&nbsp;&nbsp;&nbsp; char c_elem3;<br>&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// num 个char类型数据成员<br>};<br>&nbsp;&nbsp; cout &lt;&lt; sizeof(TestStruct1) &lt;&lt;endl;&nbsp; // it prints num.<br>&nbsp;<br>&nbsp;// 输出的结果与具体的系统结构有关，此处是32位机，故为了寻址的快捷和方便，系统会自动的填补(padding).<br>&nbsp;// int类型是4个字节，char类型为1个字节，但是此处会自动填补3个字节到struct结构中使其成为4个字节。<br>&nbsp;// 但是如果struct中只有一种类型，譬如char或int类型时，不会产生此种填补的情况。但是如果不是，它会输出<br>&nbsp;// 4的倍数个字节。<br>======================================================================<br></p>
</span></span>
<p><span></span>&nbsp;</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/24393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-05-19 16:14 <a href="http://www.cppblog.com/zerolee/archive/2007/05/19/24393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读写磁盘文件专题--采用C/C++/MFC/WIN32(API)方式</title><link>http://www.cppblog.com/zerolee/archive/2007/05/19/24389.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sat, 19 May 2007 07:54:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/05/19/24389.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/24389.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/05/19/24389.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/24389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/24389.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 采用C/C++/MFC/WIN32(API)方式读写磁盘文件的方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/zerolee/archive/2007/05/19/24389.html'>阅读全文</a><img src ="http://www.cppblog.com/zerolee/aggbug/24389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-05-19 15:54 <a href="http://www.cppblog.com/zerolee/archive/2007/05/19/24389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>N个点组成的三角形的最大和最小内切圆程序</title><link>http://www.cppblog.com/zerolee/archive/2007/05/09/23684.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Wed, 09 May 2007 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/05/09/23684.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/23684.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/05/09/23684.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/23684.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/23684.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/zerolee/archive/2007/05/09/23684.html'>阅读全文</a><img src ="http://www.cppblog.com/zerolee/aggbug/23684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-05-09 10:25 <a href="http://www.cppblog.com/zerolee/archive/2007/05/09/23684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>组件间的物理关系</title><link>http://www.cppblog.com/zerolee/archive/2007/03/20/20243.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Tue, 20 Mar 2007 12:56:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/03/20/20243.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/20243.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/03/20/20243.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/20243.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/20243.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">   开发可维护、易测试和可重用的软件需要全面的物理设计和逻辑设计的知识。物理设计研究组织的问题，超出了逻辑领域的范畴，物理设计很容易影响可测量的特性，例如运行时间、编译时间、连接时间以及可执行文件大小。<br /><br />   一个组件是由一个.c文件和.h文件组成的物理实体，它具体表达了一个逻辑抽象的具体实现。一个组件一般包含一个、两个甚至多个类，已经需要用来支持全部抽象的适当的自由运算符。一个组件（而不是一个类）是逻辑设计和物理设计的适当单位，因为它能够：<br />   1)让若干逻辑实体把一个单一的抽象表现为一个内聚单位；<br />   2)考虑到物理问题和组织问题；<br />   3)在其他程序中选择性地重用编译单元。<br /><br />   一个组件的逻辑接口仅限于指能够被客户程序通过编译访问的部分，而物理接口则包括它的整个头文件。如果在一个组件的物理接口中使用了一个用户自定义类型T，即使T是一个封装的逻辑细节，也可能迫使那个组件的客户程序在编译时依赖T的定义。<br />   组件是自我包含的、内聚的和潜在的可重用的设计单位。在一个组件内部声明的逻辑结构不应该定义在那个组件之外。一个组件的.c文件应该直接包含它的.h文件，以确保.h文件可基于它自己进行语法分析。对于每一个需要的类型定义，都始终包含其头文件，而不是依赖一个头文件去包含另一个，这样，当一个组件允许一个#include 指令从其头文件中被删除时不会出现问题。想要改进可用性、可重用性和可维护性，如果某个带有外部连接的结构没有在一个组件的.h文件声明，那么我们应该避免把该结构放在这个组件的.c文件中。同样的原因，我们应该避免使用局部声明去访问有外部连接的定义。<br />   <br />   最后友元关系虽然表面上是一个逻辑关系，但会影响到物理设计。在一个组件内部，（局部的）友元关系是那个组件的一个封装的实现细节。为了改进可用性和用户可扩展性，一个容器类常常会把同一个组件内的迭代器视作友元，不会破坏封装。友元关系只会直接影响访问权限但不会隐含依赖。</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/20243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-03-20 20:56 <a href="http://www.cppblog.com/zerolee/archive/2007/03/20/20243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C++中一些基本设计规则和指导方针</title><link>http://www.cppblog.com/zerolee/archive/2007/01/14/17615.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 14 Jan 2007 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2007/01/14/17615.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/17615.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2007/01/14/17615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/17615.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/17615.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">   C++是一种大型语言，为更大的设计空间开辟了道路。这里提供一些基本设计规则和指导方针，它们被证明是非常有用的。<br />   主要设计规则被认为是绝对不能违反的。甚至偶尔的违反也可能危及大型系统的完整性。<br />   次要设计规则也被认为是遵守的，但也许不必严格地遵守。在一个隔离的实例中违反一个次要规则不大可能产生严重的全局性影响。<br />   指导方针是作为经验法则提出来的，因此必须遵守，除非有强制性的工程方面的原因要求遵守别的原则。<br /><br />   把一个类的数据成员暴露给其客户程序违反了封装原则。提供对数据成员的非私有访问意味着表示上的局部改变可能迫使客户重新编写代码。此外，由于允许对数据成员进行可写访问，无法阻止偶尔误用导致数据处在不一致的状态。保护的成员数据像公共成员数据一样，无法限制 因数据改变而可能影响到的客户的数量。<br /><br />   全局变量会污染全局名称空间，而且会歪曲设计的物理结构，使得实际上不可能进行独立的测试和有选择的重用。在新的C++项目中没有必要使用全局变量。我们可以通过将变量放置在一个类的作用域中作为私有静态成员、并提供公共静态成员函数访问它们的方法来系统消除全部变量。但是，对这种模块的过度依赖是一种不良设计的症状。<br /><br />   自由函数，特别是那些不在任何用户自定义类型上操作的函数，在系统集成时很可能与别的函数冲突。将这样的函数嵌套在类作用域中作为静态成员基本上可以消除冲突的危险。<br /><br />   枚举类型、typedef以及常量数据也可能威胁全局名称空间。通过将枚举类型嵌套在类作用域中，任何二义性都可以通过作用域解析来消除。一个在文件作用域中的typedef看起来有点像类，但是在大型项目中急难发现。通过将typedef嵌套在类作用域中，他们就变的相对容易追踪。一个在头文件中定义的整数常量，其最好的表达方式通常是通过在类作用域中的一个枚举值来表达。其它常量类型可以通过使它们成为某个类的静态常量成员来限定其范围。<br /><br />   预处理宏对于人和机器来说都难以理解。由于宏不是C++的一部分，所以宏不遵守作用域约束，并且，如果将宏放置在一个头文件中，宏可能与系统中的任何文件的任何标识符冲突。因此，宏不应该出现在头文件中，除非是作为包含卫哨。<br /><br />   总的看来，我们应该避免在一个头文件的文件作用域中引入除了类、结构、联合和自由运算符之外的任何东西。当然，我们允许在头文件中定义内联成员函数。<br /><br />   一个定义被包含两次会引起编译时错误。因为大多数C++头文件包含定义，我们有必要防止再收敛包含图的可能性。在一个头文件中，用内部包含卫哨围绕定义可以确保每个头文件的内容在任何一个编译单元中最多被加入一次。<br /><br />   冗余（外部）包含卫哨虽然不是一定必需的，但是它可以确保我们避免编译时的二义包含行为。通过用冗余卫哨围绕头文件的包含指令，我们可以确保每个编译单元最多两次打开一个头文件。<br /><br />   良好的文档是软件开发必不可少的一部分。缺少文档将降低可用性。文档的一个重要部分是声明什么是没有定义的。否则，客户可能会依赖巧合的行为，这种行为只能来自特定的实现选择。<br />   <br /></font>
<img src ="http://www.cppblog.com/zerolee/aggbug/17615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2007-01-14 15:45 <a href="http://www.cppblog.com/zerolee/archive/2007/01/14/17615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Problems about two functions of CImage in ATL</title><link>http://www.cppblog.com/zerolee/archive/2006/12/01/15861.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Fri, 01 Dec 2006 12:36:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/01/15861.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/15861.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/01/15861.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/15861.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/15861.html</trackback:ping><description><![CDATA[
		<font face="Courier New" color="#ff0000" size="2">Author: Zero Lee (from Zero Studio)<br />Abstract: This text is going to discuss functions of Class CImage in ATL.<br /></font>
		<br />
		<font face="Courier New" size="2">   关于GetBits()函数的使用.对于一幅DIB图像来说，图像的左下角为像素数据的起点。通常我们会认为GetBits()函数返回的是图像左下角的数据指针，但是CImage实现却不是这样。<font color="#ff0000">GetBits()返回的是图像左上角的像素数据指针</font>。从这个角度上来讲，它的功能等效于函数GetPixelAddress(0,0)调用。而且CImage的成员函数中坐标是以左上角为坐标原点来表示的。<br /><br />   关于SetPixelIndexed()函数的使用. 从函数名我们可以得知，该函数应该应用于非真彩色图像，特别是8位的图像。<font color="#ff0000">在测试该函数时，发现应用于8位BMP图像时，不管设置什么索引值，操作后的结果显示索引值变成了0</font>。这个现象确实让人匪夷所思。不知道是不是CImage类的该函数设计有问题。当然，如果将它不合理地应用于真彩色图像，操作的结果还是黑色。<br /><br />   另外，CImage类中还有一些函数,譬如SetPixel()和SetPixelRGB()函数，理论上应该将它们应用于真彩色图像，但是如果强硬的将它们应用于非真彩色图像(测试中将它们应用于8位BMP图像)，操作结果显示设置的值都会被“合理”的变成灰阶数据，比如说，如果我们设置RGB值为(180,0,0),操作结果为调色板里的数据变为RGB(60,60,60).</font>
<img src ="http://www.cppblog.com/zerolee/aggbug/15861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2006-12-01 20:36 <a href="http://www.cppblog.com/zerolee/archive/2006/12/01/15861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何做一名好的开发人员</title><link>http://www.cppblog.com/zerolee/archive/2006/10/15/13705.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 15 Oct 2006 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/10/15/13705.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/13705.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/10/15/13705.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/13705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/13705.html</trackback:ping><description><![CDATA[
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">我这里想说的是一些我认为开发人员需要具备的一些素质，当然这些只是我自己的看法，希望大家能够补充。希望大家加入在线论坛谈谈自己的看法和感受：</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">比较宽的知识面，并且能够时时补充自己的知识和完善自己的知识结构</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">耐心好，特别是在调试和学习阶段，世界上没有聪明的人只有刻苦的人。做开发其实就两件事情学习和改错，在这两件事情中间的开发过程其实是比较简单的</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">永远记住：代码是给人看的而不是给机器运行的，计算机在执行程序时是不怕累的，而人在看代码时是非常累的</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">良好的编码习惯，至少保证自己能够随时看懂几个月前自己所写的代码</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">尽量让你的代码能够很容易的被别人理解，写代码时想想你会不会在两个月后被别人骂</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">不要容忍自己犯重复的错误和写重复的代码</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">知道如何做比得到代码更重要</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">尽量不要做已经有很多人已经做过的事情</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">学会尊重别人的开发成果，除非不得已不要下决定全面替换以前的系统</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">珍惜自己的时间与工作成果，尽量让别人分享自己的开发成果</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">避免假设，多思考极端情况与引起错误的可能性，努力减少低级错误</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">不要相信至少是不要轻信自己为自己所做的测试结果</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">懂得坚持自己的开发思路，并懂得理解与吸收别人的思想</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">学会与其他人保持一致，但不能放弃自己的开发特色</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">懂得向你周围的人学习，不论是开发能力上的还是开发经验上的</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">懂得软件结构的的重要性，分析代码前先分析代码的结构</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">学会总结，定期总结自己所学会的知识，看看自己前段时间因为各种原因所浪费的时间</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">学会计划，尽量不要认为通过延长自己的工作时间来完成任务</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">学会正确估计自己的能力和工作时间</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<br />
								<br />
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">下面这些是我认为一些比较适合我自己的方面，不一定对每个人都合适：</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">多看些杂志，没事情的时候可以看看以前看过的参考书，书中很可能有你以前没有注意到的一些细节</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">不要太早去做一些与开发无关的事情，因为学习的黄金时期是很短暂的</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">学会分析别人的系统，多看看别人所开发的系统的先进的一面。这里包括别人的开发思路，实现时所采用的结构</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">时常感到自己将被淘汰，经常埋怨自己的不努力</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">知道自己缺少什么</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">强迫自己做一些自己不喜欢做的事情，比如说写文档</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">能够有勇气重写自己所开发的系统，但当你重做时你应该采取和前一次不同的工作方式和方法，否则重做就没有必要</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">将问题简单化而不是复杂化</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">将维护时会产生的一部分问题转移到开发时或是设计时来解决</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">有时候也不妨问问自己：我不做开发时去做什么</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">坚持为自己做每周的开发计划，在事情没有做完以前不要轻易转移自己的注意力</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">尽可能多的将你所做的教给别人，因为你有一天可能不再负责这个系统</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">做事一定要有始有终，除非是有不得已的理由否则不要在工作完成前提前离开</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">不要将你为公司做的东西带走，你因该带走的是开发经验和对开发的认识而不是代码和产品</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">* </span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">感到累时就休息一下，给自己放个假也无妨，毕竟人不是机器</span>
				</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/13705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2006-10-15 12:38 <a href="http://www.cppblog.com/zerolee/archive/2006/10/15/13705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最好的开发人员是培养出来，而非买来的(转载)</title><link>http://www.cppblog.com/zerolee/archive/2006/10/15/13696.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 15 Oct 2006 04:18:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/10/15/13696.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/13696.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/10/15/13696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/13696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/13696.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">来自：zdnet.com.cn </font>
		<p class="ArticleInfo">
				<font face="Courier New">
						<font size="2">   认真考虑一下，得到最有天赋的项目开发人员的最佳方法是培养，而非购买。<br /><br />　　在阅读有关敏捷开发的材料时，我发现，无论是传统的软件开发技术，还是敏捷方法，都要高度依赖熟练的开发人员才能确保成功。这一事实让我触动。由于许多因素的影响，具有相似经历的开发人员的表现水平却相差很大，这点已为人们所接受；所以人们对优秀的开发人员比较关注也就不足为奇了。尽管如此，一个或一小群开发人员，利用“英雄模式”开发，通过他们的奉献精神与坚韧毅力，还是完成了许多开发工作。<br /><br />　　很明显，我们需要优秀的开发人员。但问题是，到哪去找优秀的开发人员呢？<br /><br />　　十几年来我一直参与招聘工作，我可以毫不迟疑地告诉你：有可能找到最优秀的开发人员，但是可能性不大。这不是一件容易的事，即使读完一千份简历，可能也只能找到一两个真正优秀的开发人员。<br /><br />　　认真考虑一下，你会发现，只有通过培养，而不是购买，才能得到最优秀的开发人员。<br /><br />　　<strong>什么造就最优秀的开发人员？</strong></font>
				</font>
		</p>
		<p class="ArticleInfo">
				<font face="Courier New">
						<font size="2">　　关于是什么造就最优秀的开发人员，大家持不同的看法。不管是敏捷还是传统的开发技巧都需要开发人员拥有稍异于人的东西。但是，无论开发人员应用哪种技巧，这都归结为一个词：思考。<br /><br />　　位于Bloom认知技能教育目标分类最底层的是知识。即回想（或识别）数据与信息。应用在开发方面，这就意味着识别C#语法或回想出执行循环的正确语法。<br /><br />　　位于认知分类最顶层的是综合与评估。综合指能够合成不同的因素以形成全新的解决方案。而评估是指对观念、方法或材料做出判断的能力。在工作过程中，开发人员需要不断地应用这些高层次的认知能力。<br /><br />　　许多人认为，与描述认知过程的差异相比，将这一观念表达为思考更为自然。通常，对高层次的观念（例如如何综合片段来形成解决方案）所做的思考越多，开发人员就更优秀。<br /><br />　　<strong>海底捞针 </strong></font>
				</font>
		</p>
		<p class="ArticleInfo">
				<font face="Courier New" size="2">　　在完全放弃招聘（购买）最优秀的开发人员之前，我们先通过检验专业技能来了解一下招聘过程。我例行公事地对应聘开发职位的候选人进行了一次口头测试。由于我面试的大多数开发人员需要能够熟练地操作数据库，我问他们一个简单的问题：<br /><br />　　给你一个带客户id域与名称的客户表，以及一个带序号id，客户id与其它细节的序号索引表，用什么查询可返回不带序号的客户表？<br /><br />　　此问题的答案需要应用外部连接（outer join）知识。（在SQL-87语法中，你可以应用*=，但这一答案正日益少见。）我的非正式统计表明，答对此问题的人数在10%以下。平均来说，我面试的开发人员拥有大专学历，有1到2年的工作经验。但是，据我的观察，多年的工作经验与他们是否答对此问题关系不大。<br /><br />　　对我而言，无力回答此问题表明开发人员并不完全了解SQL所要求的以集合为基础的逻辑方式。我认为这是一个优秀开发人员的基本技能。<br /><br />　　<strong>另一个问题更有趣，因为它没有正确答案：</strong><br /><br />　　</font>
				<font face="Courier New">
						<font size="2">
								<strong>你最喜欢微软.NET中的哪项功能？<br /></strong>
								<br />　　明显地，你可以在这个问题中插入任何技术。问题的答案可以清楚地告诉你开发人员的思考方向。如果它告诉我是IntelliSense（帮助你记忆对象与方法界面的Visual Studio功能），我就知道他们主要关心如何将代码加入编辑器，这并不是优秀开发人员的思考方式。顺便说一下，如果他们给出那个答案，他们可获得“加击”。（另一击？即“你还喜欢哪项功能？”）<br /><br />　　我在寻找一类表明他们正在思考文本编辑框以外的事情的答案。我在寻找这样的答案：“因为运行时间类型的信息，可编写灵活代码的能力。”这样的答案表明他们对工作进行了深入思考，这是成为最优秀的开发人员的基本条件。<br /><br />　　“你最不喜欢什么？”这个问题同样富于启示。“忘记C#中的分号”这样的答案让我怀疑候选开发人员是否达到正确的思考层次。“无力有效应用垃圾收集器”这样的答案表明他们既不了解平台的需要，也缺乏处理复杂问题的经验。<br /><br />　　问题“你最喜欢/不喜欢什么？”的回答比SQL问题的回答要好得多，但仍然并不乐观。参加面试的开发人员，超过70%回答的是琐碎的问题，其它10%左右的答案表明他们要么编码的水平不高，要么缺乏高层次的思考。<br /><br />　　最终的结果表明，要找到最优秀的开发人员几乎是不可能的事情。实际上，我也可能只招聘到2到3个可称之为最佳开发人员的人。<br /><br />　　</font>
				</font>
				<font face="Courier New">
						<font size="2">
								<strong>培养优秀的开发人员<br /></strong>
								<br />　　找到有潜质，即好奇心强、个性好学的开发人员要更容易一些。这些开发人员确实希望在自己与他人的生活中发挥重要的作用。他们可能并不了解关系数据库，但他们乐于学习。他们带来学习的热情，让周围的人充满活力。<br /><br />　　在许多机构，这种热情却以服从的名义受到压制。“我们一样那样做”的心态打消了任何改善状况的尝试。因此，开发人员常常感到困惑。因为组织一方面声明希望组建世界级的开发团队（每个组织都希望拥有这样的团队）；另一方面，他们又不愿意做出变革。<br /><br />　　但是，我们可以采取行动，以保证新开发人员的干劲与期望不会受到压制。以下是我就培养优秀开发人员提出的一些建议：<br /><br />　　<strong>指导：</strong>指定一个导师来帮助开发人员。这个人必须是一个资深开发人员，开发权威或关心团队和进程改善、乐于助人的构架师。这个人不应是开发人员的直接领导或经理（如果可能的话）。指导交谈应该以开发人员，而不是组织的需求为中心。 <br /><br />　　<strong>代码审查：</strong>代码审查是提高开发能力的有效手段。但很多组织却极少这样做。另外，人们很少把它当作是学习机会，而把它当作贬低开发人员的时机。请进行代码审查，把它当作培训与教育，而非压制的手段。 <br /><br />　　<strong>渐进体验：</strong>向开发人员提供增量分配来鼓励他们不断成长。由于我们无法控制将来的项目，这可能是最难以执行的方法。但是，提供尽可能多的渐进分配结构将会取得长期回报。 <br /><br />　　<strong>学习挑战：</strong>除了渐进分配以外，还要找出其它方式激励开发人员学习尽可能多的知识，即使这些知识不能立即起作用。例如，如果你有一家网络开发商店，鼓励开发人员学习智能客户（Smart Client）技术，以帮助开发人员养成学习习惯。 <br /><br />　　<strong>内部培养</strong></font>
				</font>
		</p>
		<p class="ArticleInfo">
				<font face="Courier New" size="2">　　尽管你想为下一个项目找到优秀的开发人员，但优秀的开发人员并不容易找到。项目的成功主要还是依靠现在团队里的开发人员。他们越优秀，你成功的机会就越大。找到技术熟练的可靠人才来完成你的需求肯定会很困难。自己培养开发人员，是获得你所需要的开发人员唯一现实</font>的方法。</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/13696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2006-10-15 12:18 <a href="http://www.cppblog.com/zerolee/archive/2006/10/15/13696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从非MFC扩展DLL中导入一个自定义的类</title><link>http://www.cppblog.com/zerolee/archive/2006/09/24/12879.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 24 Sep 2006 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/09/24/12879.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/12879.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/09/24/12879.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/12879.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/12879.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">/////////////////////////////////////////////////////////////////////////<br />该解决方案旨在提供一种能够从非MFC扩展DLL中导入一个自定义的类的方案。</font>
		</p>
		<p>
				<font face="Courier New" size="2">自定义的类从某种意义上来讲，也是一种用户自定义的数据，形如struct。<br />基于此考虑，完全可以从非MFC扩展DLL中导入非MFC的用户自定义的类。</font>
		</p>
		<p>
				<font face="Courier New" size="2">方案如下：<br />1) 首先建立一个DLL( WIN32 DLL)工程，创建头文件*.dll，自定义一个类，<br />在类的前面添加"__declspec(dllexport)"关键字，表示该工程到处这个类。<br />例如: class __declspec(dllexport) myClass ...</font>
		</p>
		<p>
				<font face="Courier New" size="2">2) 在其实现文件中，添加头文件"#include "*.h""，并实现相应的类实现部分。</font>
		</p>
		<p>
				<font face="Courier New" size="2">3) 编译执行生成*.dll文件，将其COPY到应用测试工程的执行目录下(debug/release)<br />下，COPY DLL工程的头文件*.h到应用测试工程的目录下，添加进项目中，并将其中的<br />"__declspec(dllexport)"修改为"__declspec(dllimport)"。</font>
		</p>
		<p>
				<font face="Courier New" size="2">4) 在其实现文件中添加头文件"#include "*.h""，然后对其导入的类进行相应的操作。</font>
		</p>
		<p>
				<font face="Courier New" size="2">5) 编译运行测试程序，便可以实现类相关的操作。</font>
		</p>
		<p>
				<font face="Courier New" color="#ff1493" size="2">NOTE: 对于静态/动态链接到MFC的规则DLL也可以达到同样的效果，导入自定义的类。</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/12879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2006-09-24 15:55 <a href="http://www.cppblog.com/zerolee/archive/2006/09/24/12879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何做出类似vc的workshop</title><link>http://www.cppblog.com/zerolee/archive/2006/09/12/12332.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Tue, 12 Sep 2006 04:21:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/09/12/12332.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/12332.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/09/12/12332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/12332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/12332.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<font face="Courier New" size="2">方法如下：</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">1．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span>
								<span lang="EN-US">scbarg.h</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">scbarg.cpp</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">sizecbar.h</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">sizecbar.cpp</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">mybar.h</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">mybar.cpp</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件</span>
								<span lang="EN-US">copy</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到你的工程目录下，打开</span>
								<span lang="EN-US">vc</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，将这几个文件添加进工程。</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">2．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打开</span>
								<span lang="EN-US">stdafx.h</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，在其中加入：</span>
								<span lang="EN-US">#include "sizecbar.h"</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">#include "scbarg.h"</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">3．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span>
								<span lang="EN-US">CmainFrame</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类添加成员变量：</span>
								<span lang="EN-US">CMyBar<span style="mso-tab-count: 2">        </span>m_wndMyBar</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">4．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重载</span>
								<span lang="EN-US">CMainFrame::DestroyWindow()</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在其中加入</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>CString sProfile(_T("BarState"));</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>m_wndMyBar.SaveState(sProfile);</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<font face="Courier New" size="2">SaveBarState(sProfile);</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">5．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改</span>
								<span lang="EN-US">CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如下：</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">{</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>return -1;</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">
								<font face="Courier New" size="2">       </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>{</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>TRACE0("Failed to create toolbar\n");</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>return -1;<span style="mso-spacerun: yes">      </span>// fail to create</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>}</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>if (!m_wndStatusBar.Create(this) ||</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>!m_wndStatusBar.SetIndicators(indicators,</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>
										<span style="mso-spacerun: yes">  </span>sizeof(indicators)/sizeof(UINT)))</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>{</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>TRACE0("Failed to create status bar\n");</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 2">              </span>return -1;<span style="mso-spacerun: yes">      </span>// fail to create</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>}</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>
										<b>
												<font color="#ff1493">if (!m_wndMyBar.Create(_T("My Bar"), this, 123))<o:p></o:p></font>
										</b>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">       </span>{<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">           </span>TRACE0("Failed to create mybar\n");<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">        </span>   return -1;<span style="mso-spacerun: yes">      </span>// fail to create<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-tab-count: 1">       </span>}<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>// TODO: Delete these three lines if you don't want the toolbar to</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>//<span style="mso-spacerun: yes">  </span>be dockable</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>
										<b>
												<font color="#ff1493">m_wndMyBar.SetBarStyle(m_wndMyBar.GetBarStyle() |<o:p></o:p></font>
										</b>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">       </span>CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)</font>;<o:p></o:p></font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>
										<b>
												<font color="#ff1493">m_wndMyBar.EnableDocking(CBRS_ALIGN_ANY);</font>
												<o:p>
												</o:p>
										</b>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>EnableDocking(CBRS_ALIGN_ANY);</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>DockControlBar(&amp;m_wndToolBar);</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>
										<b>
												<font color="#ff1493">DockControlBar(&amp;m_wndMyBar, AFX_IDW_DOCKBAR_LEFT);<o:p></o:p></font>
										</b>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>
										<b>
												<font color="#ff1493">CString sProfile(_T("BarState"));<o:p></o:p></font>
										</b>
								</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">       </span>if (VerifyBarState(sProfile))<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">       </span>{<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">           </span>m_wndMyBar.LoadState(sProfile);<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">           </span>LoadBarState(sProfile);<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<b>
						<span lang="EN-US">
								<font face="Courier New">
										<font size="2">
												<font color="#ff1493">
														<span style="mso-spacerun: yes">       </span>}<o:p></o:p></font>
										</font>
								</font>
						</span>
				</b>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>return 0;</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<font face="Courier New" size="2">注：红色字体部分为所加内容。</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">6．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在“查看”菜单下添加菜单项</span>
								<span lang="EN-US">mybar</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，设其</span>
								<span lang="EN-US">id</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为：</span>
								<span lang="EN-US">ID_VIEW_MYBAR.</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt">
				<font face="Courier New">
						<font size="2">
								<span lang="EN-US">7．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为其添加</span>
								<span lang="EN-US">CMainFrame::OnViewMybar()</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
								<span lang="EN-US">CMainFrame::OnUpdateViewMybar(CCmdUI* pCmdUI)</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数，内容为：</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">void CMainFrame::OnViewMybar() </font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">{</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>// TODO: Add your command handler code here</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>BOOL bShow = m_wndMyBar.IsVisible();</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>ShowControlBar(&amp;m_wndMyBar, !bShow, FALSE);</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">void CMainFrame::OnUpdateViewMybar(CCmdUI* pCmdUI) </font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">{</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>// TODO: Add your command update UI handler code here</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>pCmdUI-&gt;Enable();</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New">
								<font size="2">
										<span style="mso-tab-count: 1">       </span>pCmdUI-&gt;SetCheck(m_wndMyBar.IsVisible());</font>
						</font>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<font face="Courier New" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal">
				<font face="Courier New">
						<font size="2">
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译运行即可，如果你想改变</span>
								<span lang="EN-US">workshop</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
								<span lang="EN-US">cedit</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成员变量（如本例</span>
								<span lang="EN-US">workshop</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的树），只需改变</span>
								<span lang="EN-US">mybar</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的代码即可。<br />下载连接：<font color="#0000ff"><u>CMyBar.rar(<a href="/zerolee/admin/Files.aspx">http://www.cppblog.com/zerolee/admin/Files.aspx</a>)<br /></u></font></span>
						</font>
				</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/12332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2006-09-12 12:21 <a href="http://www.cppblog.com/zerolee/archive/2006/09/12/12332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>