??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品成人久久久久久久,久久综合精品国产一区二区三区,996久久国产精品线观看http://www.shnenglu.com/walkspeed/category/3746.htmlzh-cnMon, 19 May 2008 19:02:38 GMTMon, 19 May 2008 19:02:38 GMT60boost正则表达式库单介l?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/12/28/39823.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Fri, 28 Dec 2007 06:01:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/12/28/39823.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/39823.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/12/28/39823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/39823.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/39823.html</trackback:ping><description><![CDATA[头文?regex.hpp<br><br>常用的类<br>boost::regex 正则表达?br><br>boost::cmatch 以char数组为容器,存储匚wq回倹{?br>boost::smatch 以std::string为容器,存储匚wq回倹{?br><br>boost::regex_match 匚w法<br>boost::regex_search 查找法<br>boost::regex_replace 替换法<br><br>单例?br><br>#include <iostream><br><br>#include <boost/regex.hpp><br><br>int main( int argc, char* argv[] )<br>{<br>    char *buf = "This is boost::regex example";<br><br>    boost::regex exampleregex( "boost::regex" );<br>    boost::cmatch result;<br><br>    if( boost::regex_search( buf, result, exampleregex ) )<br>    {<br>        std::cout << result.str() << std::endl;<br>    }<br><br>    return 0;<br>}<br><br>注意regex.hpp的包含。要在开发工具中讄boost头文件所在位子?br><br> <br><img src ="http://www.shnenglu.com/walkspeed/aggbug/39823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-12-28 14:01 <a href="http://www.shnenglu.com/walkspeed/archive/2007/12/28/39823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>snmpZ用oid来唯一标识对象http://www.shnenglu.com/walkspeed/archive/2007/08/31/31297.htmlwalkspeedwalkspeedFri, 31 Aug 2007 06:01:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/08/31/31297.htmlhttp://www.shnenglu.com/walkspeed/comments/31297.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/08/31/31297.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/31297.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/31297.html    可以领用UUID来生成我们需要的唯一标识。但是在snmp中ƈ没有选着UUID来标识每个对象,而是使用
了自p计的Oid。这是ؓ(f)何呢Q本为,UUID虽可以唯一表示对象?qing)其实例Q但是UUID之间没有什?br>关系Q不能Ş成一U结构来表示对象之间的关pR而Oid的显现却能满以上两点,唯一表示对象和显C?br>对象之间的结构,甚至是对象的实例的唯一标识和实例之间的关系?br>    q也l我们一个启C,分布式系l中对象的标识除了具有唯一性外Q要有一定显C对象之间关pȝ?br>力,?x)更好?br>

walkspeed 2007-08-31 14:01 发表评论
]]>
接口设计的要点(接口不应被用者直接销毁)http://www.shnenglu.com/walkspeed/archive/2007/08/07/29457.htmlwalkspeedwalkspeedTue, 07 Aug 2007 01:49:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/08/07/29457.htmlhttp://www.shnenglu.com/walkspeed/comments/29457.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/08/07/29457.html#Feedback1http://www.shnenglu.com/walkspeed/comments/commentRss/29457.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/29457.html阅读全文

walkspeed 2007-08-07 09:49 发表评论
]]>
Boost.Bind的基使用http://www.shnenglu.com/walkspeed/archive/2007/07/20/28448.htmlwalkspeedwalkspeedFri, 20 Jul 2007 09:15:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/07/20/28448.htmlhttp://www.shnenglu.com/walkspeed/comments/28448.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/07/20/28448.html#Feedback2http://www.shnenglu.com/walkspeed/comments/commentRss/28448.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/28448.htmlresulttype funname( arglist );
q回值类?函数? 参数列表 );

在Boost.Function中,我们可以方便的定义定义函数对象。不q在定义用来表示cL员函数的函数对象?br>W一个参数是cL针。而且在调用时Q要传入一个类实例的指针。这L(fng)hq不是很方便Q因用?br>要知道类实例。这实际上没有实现解耦。而解耦是我们使用回调或委托设计的一个目标?br>
Z解决q个问题Q我们要使用Boost.Bind?br>
Boost.Bind是一个函数对象工厂。他用来产生我们需要的函数对象。好了,有了它,你可以在你设计中?br>量用Boost.Function。不用再d义类成员函数形式的函数对象啦Q只用定义普通函数对象?br>
一个简单的例子

class CExample
{
public:
    bool printstr( const std::string &str )
    {
        std::cout << "CExample::printstr" << str << std::endl;
        return true;
    }
};

//定义一个函数对?br>boost::function< bool ( const std::string& ) > printstr;

//用Boost.Bind创徏一个函数对象,赋给printstr
CExample example;
printstr = boost::bind( &CExample::printstr, &example, _1 );

好了Q我们创Z一个函数对象,而且调用时不再需要类实例拉。用Boost.Function和Boost.Bind大大
的简化了Command模式的实现?br>
在上面的例子中要个古怪的对象"_1"。这个叫做站位符Q他代表q个位置有个参数Q但现在q不知道?br>数是什么。_1代表参数列表中的W一个位|上的参数。Boost.Bind一共定义了9个站位符对象。如?br>_1,_2,_3,_4,_5,_6,_7,_8,_9。分别代表参数列表中位子?br>
Boost.Bind产生的函数对象可以直接用,利用上面的例子?br>
bool b = boost::bind( &CExample::printstr, &example, _1 )( "Hello World" );




walkspeed 2007-07-20 17:15 发表评论
]]>
Boost.Function的基本?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/07/18/28272.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 18 Jul 2007 05:28:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/07/18/28272.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/28272.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/07/18/28272.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/28272.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/28272.html</trackback:ping><description><![CDATA[Boost.Function库用来提供一个对象化的函数指针?br><br>函数指针对设计很有用。它使调用者可以g期调用,调用时机p用者确定。而且可以改变<br>响应者,以应对不同的要求?br><br>C中的函数指针只能用于自由函数。在C++中除了自由函数还有函数对象和cL员函敎ͼq些<br>C的函数指针是无法用的。这要求能适应C++语言的函数指针。既然C++语言本n没有提供Q?br>那就提供一个库。stl提供了,但是定义了很多类型,使用hq不是很方便Q而且函数参数<br>的个数被限定在两个以下,更能是备受限制。Boost.Function库提供了一个好的解x案?br><br>Boost.Function库可以支持自由函敎ͼ函数对象Q类成员函数。而且参数个数多达10个?br>Boost.Function库利用模板技术来实现。生成的代码有很高的q行效率。本库可以不用编?br>直接使用?br><br>Boost.Function的头文g?br>function.hpp<br><br>定义一个Boost.Function的对象(是一个返回值类型ؓ(f)intQ第一个参数是std::stringcd<br>W二个参数是floatcLQ?br><br>boost::function< int ( std::string, float ) > funptr;<br><br>上面q个定义方式是一U容易理解的定义方式。但有些~译器不支持Q如果想更多的编译器<br>支持Q则用下面这U定义方?br><br>boost::function2< int, std::string, float > funptr;<br><br>注意模板中有3个类型,而functioncd是boost::function2。应回值类型不计算在参?br>cd中(原因很简单,C++的编译器不会(x)Ҏ(gu)q回cd不同来区分函数定义的不同Q?br><br>int freefun( std::string str, float f )<br>{<br>    std::cout << str << " : " << f << std::endl;<br>    return 0;<br>}<br><br>class CFun<br>{<br>public:<br>    int operator() ( std::string str, float f )<br>    {<br>        std::cout << str << " : " << f << std::endl;<br>        return 0;  <br>    }<br>}<br><br>上面定义了一个自由函数和一个函数对象。下面将把他们付lfunction对象?br><br>赋gؓ(f)自由函数<br>funptr = &freefun;<br><br>赋gؓ(f)函数对象<br>CFun fun;<br>funptr = fun;<br><br>以上两种情况的调用方法一_(d)如下<br>funptr( "float =", 10.0 );<br><br>Boost.Function对象要能指向cd原函敎ͼ其定义要如下<br><br>class FreeClass<br>{<br>public:<br>    int out( std::string str, float f )<br>    {<br>        std::cout << str << " : " << f << std::endl;<br>        return 0;  <br>    }<br>};<br><br>boost::function< int ( FreeClass*, std::string, float ) > funptr;<br><br>跨^台的定义Ҏ(gu)<br>boost::function3< int, FreeClass*, std::string, float > funptr;<br><br>赋值方?br>funptr = &FreeClass::out;<br><br>调用Ҏ(gu)<br>FreeClass fc;<br><br>funptr( &fc, "float =", 10.0 );<br><br><br> <img src ="http://www.shnenglu.com/walkspeed/aggbug/28272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-07-18 13:28 <a href="http://www.shnenglu.com/walkspeed/archive/2007/07/18/28272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>领域分析--认识领域分析http://www.shnenglu.com/walkspeed/archive/2007/07/11/27869.htmlwalkspeedwalkspeedWed, 11 Jul 2007 07:54:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/07/11/27869.htmlhttp://www.shnenglu.com/walkspeed/comments/27869.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/07/11/27869.html#Feedback2http://www.shnenglu.com/walkspeed/comments/commentRss/27869.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/27869.html
软g分析的开端一般是需求分析。但是在实践中,发现了很多的问题?br>1 用户的需求ƈ不是有用h出。在和用h软g的风险承担者交谈后Q会(x)常发玎ͼ他们对自己想要的
软gq不是很清楚Q会(x)提出一些笼l的要求。在开发出一个原型后Q他们会(x)修正或更改,甚至推翻他们
的需求。你?x)发现是你在不断的提出、完善需求,用户或风险承担者只是在裁决你的需求。而这样下?br>你的软g要不断的改,好像遥遥无期?br>2 需求多是一U功能的集合。Y件出来后Q如果有了改动,或在新的目中去复用以前的Y件会(x)发现?br>难。对每个需求,你不得不从头开始?br>
领域分析和需求分析不同,它不是面向功能的。而是面向问题的。这有些像考试中解题。针对特定的?br>题,来提供解x案,q在q个Ҏ(gu)的直接指g解出题目。这个直接指导很有意义,应ؓ(f)直接指导?br>C题的Ҏ(gu)被应用到解题的q程中(x可实现的Q?br>
领域分析不是对要构造的软gq行全面的分析。而是对Y件涉?qing)到的特定的领域q行分析Q如写多媒体
软gQ你要对韌频领域进行分析)。而领域是与特定的知识相关联的Q如韌频领域中关于音频、视
频编解码知识Q领域分析要搞清楚这个领域中的知识,扑և各知识点中的关系Qƈ对它们进行抽象,?br>成模型。领域分析强调的是问题域。这是说它面对的是一个相对确定的范围。Y件要解决的是一个相
对确定的范围。也有利于测试Y件?br>
领域分析不能代替需求分析,但是可以q需求来对特定的领域q行分析。领域分析后产生的设计要?br>接指导实玎ͼ可以映射到Y件中。由于领域分析是面对问题的,它生的软g不一定能满需求,可能
Ҏ(gu)对应不上需求。但是它是特定问题的解决Ҏ(gu)Q可以作Z个机制来支持需求的实现。而且特定
的问题或着说这U反应某个领域中的知识关pȝ软g其对应的是一U稳定的需求,比较Ҏ(gu)复用、测?br>和发展?br>
面对需求分析得到是一U应用的要求。而根据Y件涉?qing)的领域q行分析Q得到的是它的基本机制。应?br>是多L(fng)Q而机制其实就只有那么几个。根据应用的要求来组合这些机制。这样需求的变化Qƈ不会(x)?br>q多的冲M通过领域分析得到的模型和实现。你要做的是对他们进行组合?img src ="http://www.shnenglu.com/walkspeed/aggbug/27869.html" width = "1" height = "1" />

walkspeed 2007-07-11 15:54 发表评论
]]>
内存泄露和对象泄?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/31/25180.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Thu, 31 May 2007 02:50:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/31/25180.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/25180.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/31/25180.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/25180.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/25180.html</trackback:ping><description><![CDATA[    new出来的空间如果没有主动销毁,在程序退出时仍可能有内存的泄霌Ӏ?br>操作pȝ描述刎ͼ在进E退出时?x)销毁它所使用的所有内存空_(d)但这只是<br>一个模型上的构惛_描述。在实际的操作系l的实现上ƈ不能做到q一炏V?br>因ؓ(f)Q要实现在进E退出时销毁它所使用的内存空_(d)pl每个被使用?br>内存I间打一个标Q表CD内存空间被那个q程使用。在q种情况下,?br>果有多个使用内存量的进E,q且被频J的创徏和销毁,那么光记住那?br>q程标致p占用很大的内存空_(d)q是一个很不划的Ҏ(gu)。所以在实际<br>中,操作pȝq没有给每个q程使用的内存空间打标。这P有些内存是<br>没有被回收的Q如果多ơ开兌个程序就?x)发玎ͼ有内存被大量的占用,?br>不能被释放?br>    所以那些在E序中只有一个实例,q且是被new出来的对象,也应该主?br>的去手动销毁,而不能依赖程序退出时ql销毁?br><br>    被new出来的对象其销毁是两个步骤?br>    1 析构对象。条用对象的析构函数Q将对象占用的资源释放掉?br>    2 释放内存。将对象所占用的内存释放掉?br>    <br>    如果new出来的对象没有被销毁,?x)造成q个层面上的泄露?br>    1 对象泄露。他?x)造成背对象占用的资源也没有销毁或释放。比如在对象<br>中占有文件的句柄Q在析构时才释放。如果对象泄露了Q这个句柄是不会(x)被释<br>攄。那个文件会(x)一直被占用。如果文件打开时是独占的,那么?qing)时对象所?br>的程序退ZQ别的程序也别想讉Kq个文g?br>    2 内存泄露。所占用的内存不能被释放?<br><br><img src ="http://www.shnenglu.com/walkspeed/aggbug/25180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-31 10:50 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/31/25180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Berkeley DB在Queue模式下的使用2http://www.shnenglu.com/walkspeed/archive/2007/05/30/25117.htmlwalkspeedwalkspeedWed, 30 May 2007 05:58:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/30/25117.htmlhttp://www.shnenglu.com/walkspeed/comments/25117.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/30/25117.html#Feedback2http://www.shnenglu.com/walkspeed/comments/commentRss/25117.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/25117.html
Queue模式L据的一个简单的CZ
在Queue模式下读数据Q记录(DbtQ要调用set_ulen函数和set_flags函数

#include < time.h >
#include < iostream >
#include < bdb/db_cxx.h >

struct ValueType
{
    int _int;
    char _char;
    char _array[256];
};

void readDB( void )
{
    Db bdb( 0, 0 );

    bdb.set_re_len( sizeof( ValueType ) ); //用Queue模式一定要调用Q而且一定要在open前调?br>    bdb.set_re_pad( 0x00 ); //Z字符串的填充??br>
    bdb.open( 0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0 );

    size_t k;
    ValueType v;
    Dbt key( &k, sizeof( size_t ) );
    key.set_ulen( sizeof( size_t ) );

    Dbt value( &v, sizeof( ValueType ) );
    value.set_ulen( sizeof( ValueType ) );
    value.set_flags( DB_DBT_USERMEM );

    //直接用数据库的读函数
    for( int i=0; i<1000000; ++i )
    {
        bdb.get( 0, &key, &value, DB_CONSUME );
    }

    bdb.close( 0 );
}

int main( int argc, char* argv[] )
{
    clock_t et1 = clock();
    readDB();
    clock_t et2 = clock();

    std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
    return 0;



walkspeed 2007-05-30 13:58 发表评论
]]>
Berkeley DB在Queue模式下的使用 1http://www.shnenglu.com/walkspeed/archive/2007/05/29/25089.htmlwalkspeedwalkspeedTue, 29 May 2007 10:03:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/29/25089.htmlhttp://www.shnenglu.com/walkspeed/comments/25089.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/29/25089.html#Feedback3http://www.shnenglu.com/walkspeed/comments/commentRss/25089.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/25089.html
Queue模式下仅能存储定长的记录Q既value的长度ؓ(f)定长。Queue的key是一个逻辑增长的数Q一般就是int?br>不需要开发者去改变q个cd?br>
Queue模式下只能存储定长的记录。所以一定要调用DB的set_re_length函数来设定数据库中记录的长度?br>如果没有讑֮Q默认的?。这样当存储记录时一定会(x)报异常。程序出错?br>在读取记录时Q当记录的长度小于设定的长度Ӟ?x)填充字W达到设定长度?br>默认的字Wؓ(f)0x02QASCII中的Q。可以设定自q填充字符。调用DB的set_re_pad?br>
一个简单的CZ

#include < time.h >
#include < iostream >
#include < bdb/db_cxx.h >

struct ValueType
{
    int _int;
    char _char;
    char _array[256];
};

void writeDB( void )
{
    Db bdb( 0, 0 );

    bdb.set_re_len( sizeof( ValueType ) ); //用Queue模式一定要调用Q而且一定要在open前调?br>    bdb.set_re_pad( 0x00 ); //Z字符串的填充??br>
    bdb.open( 0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0 );

    size_t k;
    ValueType v;
    Dbt key( &k, sizeof( size_t ) );
    Dbt value( &v, sizeof( ValueType ) );

    //直接用数据库的写函数
    for( int i=0; i<1000000; ++i )
    {
        bdb.put( 0, &key, &value, DB_APPEND );
    }

    bdb.close( 0 );
}

int main( int argc, char* argv[] )
{
    clock_t et1 = clock();
    writeDB();
    clock_t et2 = clock();

    std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
    return 0;
}

在Queue模式下不能用游标q行数据的插入。只能进行数据的修改?br> 
 


walkspeed 2007-05-29 18:03 发表评论
]]>
Berkeley DB对ƈ发的支持http://www.shnenglu.com/walkspeed/archive/2007/05/26/24892.htmlwalkspeedwalkspeedSat, 26 May 2007 08:17:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/26/24892.htmlhttp://www.shnenglu.com/walkspeed/comments/24892.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/26/24892.html#Feedback1http://www.shnenglu.com/walkspeed/comments/commentRss/24892.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/24892.html
要让Berkeley DB数据支持q发Q就要创建Berkeley DB的环境(environmentQ?br>环境cL DbEnv。要支持q发Q在初始化DbEnv时要用DB_INIT_CDB、DB_INIT_MPOOL
两个标致?br>
如下

DbEnv envQ?br>env.open( "evn", DB_INIT_CDB|DB_INIT_MPOOL, 0 );

然后在创建数据库Ӟ环境传l数据库。如?br>
Db bdb( &env, 0 );

q样可以支持ƈ发了?br>
Berkeley DBq发的简单原?br>Berkeley DB的ƈ发遵循的是允许同时多个读操作Q当只有一个写操作?br>1 每个游标有一锁,非游标的d用一?br>2 写操作等待所有的读锁解锁?br>3 L作不需要等待写锁解锁?


walkspeed 2007-05-26 16:17 发表评论
]]>
Berkeley DB的介l?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/26/24886.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 26 May 2007 03:26:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/26/24886.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/24886.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/26/24886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/24886.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/24886.html</trackback:ping><description><![CDATA[Berkeley DB的访问方法有四种BTree、Hash、Queue、Recno<br>他们在DB创徏旉择Q而且只能在创建时选择。一炚w定某一个访问方法,<br>在用中不能改变?br><br>BTree 数据被存储在一个排序的q?wi)结构中。key和value都可以是单数<br>据(如整型,字符ԌQ也可以是复杂数据(如结构)。当有多个数据的key<br>相同Ӟ可以有复本?br><br>Hash 数据存储在一个扩展的U性hash表中。其他的Ҏ(gu)象BTree?br><br>Queue 数据存储在一个队列中Q记录是定长的。keyZ个逻辑敎ͼ不由用户<br>选择cd。在N插入记录Q在头部删除记录和取录非常的快。提供了<br>记录水^~,提高在ƈ发下的访问?br><br>Recno 数据可以是定常或是变长的记录。其他特性象Queue。key也是一个逻辑数?br><br>数据库访问方法的选择?br>Ҏ(gu)key可否用户定义分ؓ(f)BTree、Hash一l,Queue、Renco一l?br><br>BTree与Hash之间的选择<br>如果数据量不Q能被放到内存中。这U情况下选择BTree。即在小数据量的情况?br>选用BTreeQ原因是在利用key来定录时Q成功的几率大些。Hash有退步算法?br><br>但是在大数据量的情况下,׃数据q不能都在数据库中,要访问磁盘,q且BTree<br>要维护的内部信息大于HashQ访问磁盘的几率大于HashQ会(x)造成讉K的瓶颈。所?br>在大数据量下选择Hash?br><br>Queue与Recno之间的选择<br>用在多ƈ发下最好用Queue。但是如果记录是变长的,只能选Recno了。在其它的情<br>况下Q两者没有明昄差别?br><br>Berkeley DB支持从非常小的数据库?56T的数据容量的数据库。单个key或recode<br>最大可以ؓ(f)4G的数据?br><br>Berkeley DB的数据库被存储ؓ(f)二进制的格式Q有利于q_的移植?br><br>Berkeley DB支持q发的访问,但是不能用在NSFQ网l文件系l)下。因为无法定位和<br>获得数据库的环境Q在环境中设|对q发的控Ӟ?br><br>Berkeley DB的环境(EnvironmentsQ提供了以下的功?br>1 多数据库文gQMulti-database filesQ。将多个数据存储在一个物理文件中?br>2 提供多线E或多进E的支持QMulti-thread and multi-process supportQ?br>3 事务处理<br>4 高可用性(重复性)支持。即一个主数据库,和多个提供只读能力的复制数据?br>5 日志子系l? <br> <img src ="http://www.shnenglu.com/walkspeed/aggbug/24886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-26 11:26 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/26/24886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++标准库中用来计算旉差的函数 C++标准库用来格式化输出旉字符?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/25/24831.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Fri, 25 May 2007 07:30:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/25/24831.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/24831.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/25/24831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/24831.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/24831.html</trackback:ping><description><![CDATA[C++标准库中用来计算旉差的函数<br>头文?< time.h ><br><br>double difftime( <br>   time_t timer1,<br>   time_t timer0 <br>);<br>double _difftime32( <br>      __time32_t timer1,<br>   __time32_t timer0 <br>);<br>double _difftime64( <br>   __time64_t timer1,<br>   __time64_t timer0 <br>);<br><br>C++标准库用来格式化输出旉字符?br>头文?< time.h ><br><br>size_t strftime(<br>   char *strDest,<br>   size_t maxsize,<br>   const char *format,<br>   const struct tm *timeptr <br>);<br>size_t _strftime_l(<br>   char *strDest,<br>   size_t maxsize,<br>   const char *format,<br>   const struct tm *timeptr,<br>   _locale_t locale<br>);<br>size_t wcsftime(<br>   wchar_t *strDest,<br>   size_t maxsize,<br>   const wchar_t *format,<br>   const struct tm *timeptr <br>);<br>size_t _wcsftime_l(<br>   wchar_t *strDest,<br>   size_t maxsize,<br>   const wchar_t *format,<br>   const struct tm *timeptr,<br>   _locale_t locale<br>);<br><br>The formatting codes for strftime are listed below:<br><br>%a<br>    Abbreviated weekday name<br><br>%A<br>    Full weekday name<br><br>%b<br>    Abbreviated month name<br><br>%B<br>    Full month name<br><br>%c<br>    Date and time representation appropriate for locale<br><br>%d<br>    Day of month as decimal number (01 – 31)<br><br>%H<br>    Hour in 24-hour format (00 – 23)<br><br>%I<br>    Hour in 12-hour format (01 – 12)<br><br>%j<br>    Day of year as decimal number (001 – 366)<br><br>%m<br>    Month as decimal number (01 – 12)<br><br>%M<br>    Minute as decimal number (00 – 59)<br><br>%p<br>    Current locale's A.M./P.M. indicator for 12-hour clock<br><br>%S<br>    Second as decimal number (00 – 59)<br><br>%U<br>    Week of year as decimal number, with Sunday as first day of week (00 – 53)<br><br>%w<br>    Weekday as decimal number (0 – 6; Sunday is 0)<br><br>%W<br>    Week of year as decimal number, with Monday as first day of week (00 – 53)<br><br>%x<br>    Date representation for current locale<br><br>%X<br>    Time representation for current locale<br><br>%y<br>    Year without century, as decimal number (00 – 99)<br><br>%Y<br>    Year with century, as decimal number<br><br>%z, %Z<br>    Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown<br><br>%%<br>    Percent sign <br><img src ="http://www.shnenglu.com/walkspeed/aggbug/24831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-25 15:30 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/25/24831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++标准库中stringcM用的注意?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/25/24825.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Fri, 25 May 2007 06:47:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/25/24825.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/24825.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/25/24825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/24825.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/24825.html</trackback:ping><description><![CDATA[C++标准库中stringcM用的注意?br><br>在stringcM间进行复制没有什么问题?br>但是要拷贝到内存中时p注意。一定要在string取出的长度上??br><br>如下<br><br>char buf[256];<br>std::string str = "1234567890";<br><br>memcpy( buf, str.c_str(), str.length()+1 );<br><br>q样才能拯到字W串的结束符‘0’。要不就拯不到?br>string的length函数只计有效字W的长度。如同C中的strlen函数? <br><img src ="http://www.shnenglu.com/walkspeed/aggbug/24825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-25 14:47 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/25/24825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在工作中Ҏ(gu)件操作引发的xhttp://www.shnenglu.com/walkspeed/archive/2007/05/24/24764.htmlwalkspeedwalkspeedThu, 24 May 2007 08:42:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/24/24764.htmlhttp://www.shnenglu.com/walkspeed/comments/24764.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/24/24764.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/24764.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/24764.html对象要依附与某个资源?br>
所以在C++标准库中Q流都是不可拯的和赋值的?br>一个类有了对象成员,那么它也׃可拷贝和赋g?br>如果q行了拷贝和赋g(x)出现q行旉误?br>
q也表现了一U设计范型?br>资源只能在资源的使用者中保存其应用。ƈ在资源的使用者环境中创徏?br>不同使用者之间只传递资源的描述Q而不直接传递资源?br>
例如?br>一个类要用文件?br>只传递给q个cL件的描述Q如文g名,偏移量等{?br>而不传个他一个文件?br>
q个cdҎ(gu)q些描述来开启文件。对其操作?


walkspeed 2007-05-24 16:42 发表评论
]]>
tml构中每个字D늚解释http://www.shnenglu.com/walkspeed/archive/2007/05/23/24684.htmlwalkspeedwalkspeedWed, 23 May 2007 04:02:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/23/24684.htmlhttp://www.shnenglu.com/walkspeed/comments/24684.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/23/24684.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/24684.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/24684.html
tml构中的每个D|一个intcd

tm_sec U钟?Q?9?br>tm_min 分钟?Q?9?br>tm_hour 时?Q?3】。是从午夜开始计时。UTC下是是以格林威治为标?Qlocal下是以本地时Zؓ(f)标准0.
                       gmtimeq回的是UTCQlocaltimeq回的是本地?br>tm_mon 月䆾?Q?1】。注意是0?1.而不是常用的1?2.
tm_year q䆾。是?900q开始计。即记录的是本年?900q的差倹{?br>tm_wday 表示在一个星期中的第几天?Q??br>tm_yday 表示一q中的第几天?Q?65】,1?日ؓ(f)0
tm_isdst 不清楚,文档中只是说在gmtime下ؓ(f)0


walkspeed 2007-05-23 12:02 发表评论
]]>
用于旉的c的运行时函数库中的函?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/22/24586.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Tue, 22 May 2007 02:00:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/22/24586.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/24586.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/22/24586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/24586.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/24586.html</trackback:ping><description><![CDATA[tml构的D{换ؓ(f)一个time_tcd的?br>?2位系l中time_t是一个long?br>头文?<time.h><br><br>time_t mktime(<br>   struct tm *timeptr <br>);<br>__time32_t _mktime32(<br>   struct tm *timeptr <br>);<br>__time64_t _mktime64(<br>   struct tm *timeptr <br>);<br><br>获得pȝ旉?br>头文?<time.h><br>In Visual C++ 2005, time is a wrapper for _time64 and time_t is, by default, equivalent to __time64_t. <br>If you need to force the compiler to interpret time_t as the old 32-bit time_t, you can define _USE_32BIT_TIME_T. <br>This is not recommended because your application may fail after January 18, 2038; the use of this macro is not allowed on 64-bit platforms.<br><br>time_t time(<br>   time_t *timer <br>);<br>__time32_t _time32(<br>   __time32_t *timer <br>);<br>__time64_t _time64(<br>   __time64_t *timer <br>);<br><br><br>时间{换成一个字W串<br>头文?<time.h><br><br>char *ctime( <br>   const time_t *timer <br>);<br>char *_ctime32( <br>   const __time32_t *timer )<br>;<br>char *_ctime64( <br>   const __time64_t *timer )<br>;<br>wchar_t *_wctime( <br>   const time_t *timer <br>);<br>wchar_t *_wctime32( <br>   const __time32_t *timer<br>);<br>wchar_t *_wctime64( <br>   const __time64_t *timer <br>);<br><br>时间{换成一个字W串<br>是个安全的版本,用来替代上面的函?br>头文?<time.h><br><br>errno_t ctime_s( <br>   char* buffer,<br>   size_t sizeInBytes,<br>   const time_t *time <br>);<br>errno_t _ctime32_s( <br>   char* buffer,<br>   size_t sizeInBytes,<br>   const __time32_t *time <br>);<br>errno_t _ctime64_s( <br>   char* buffer,<br>   size_t sizeInBytes,<br>   const __time64_t *time )<br>;<br>errno_t _wctime_s( <br>   wchar_t* buffer,<br>   size_t sizeInWords,<br>   const time_t *time <br>);<br>errno_t _wctime32_s( <br>   wchar_t* buffer,<br>   size_t sizeInWords,<br>   const __time32_t *time <br>);<br>errno_t _wctime64_s( <br>   wchar_t* buffer,<br>   size_t sizeInWords,<br>   const __time64_t *time <br>);<br>template <size_t size><br>errno_t _ctime32_s( <br>   char (&buffer)[size],<br>   const __time32_t *time <br>); // C++ only<br>template <size_t size><br>errno_t _ctime64_s( <br>   char (&buffer)[size],<br>   const __time64_t *time<br>); // C++ only<br>template <size_t size><br>errno_t _wctime32_s( <br>   wchar_t (&buffer)[size],<br>   const __time32_t *time <br>); // C++ only<br>template <size_t size><br>errno_t _wctime64_s( <br>   wchar_t (&buffer)[size],<br>   const __time64_t *time <br>); // C++ only<br><br><br>时间D{换成一个结?br>头文?<time.h><br><br>struct tm *gmtime( <br>   const time_t *timer <br>);<br>struct tm *_gmtime32( <br>   const time32_t *timer <br>);<br>struct tm *_gmtime64( <br>   const __time64_t *timer <br>);<br><br>时间D{换成一个结?br>头文?<time.h><br>同上面函数的功能Q是安全版本<br><br>errno_t _gmtime_s(<br>   struct tm* _tm,<br>   const __time_t* time<br>);<br>errno_t _gmtime32_s(<br>   struct tm* _tm,<br>   const __time32_t* time<br>);<br>errno_t _gmtime64_s(<br>   struct tm* _tm,<br>   const __time64_t* time <br>);<br><br>时间{换成本地旉?br>头文?<time.h><br><br>struct tm *localtime(<br>   const time_t *timer <br>);<br>struct tm *_localtime32(<br>   const __time32_t *timer<br>);<br>struct tm *_localtime64(<br>   const __time64_t *timer <br>);<br><br>时间{换成本地旉?br>头文?<time.h><br>同上面函数的功能Q是安全版本<br><br>errno_t _localtime_s(<br>   struct tm* _tm,<br>   const time_t *time <br>);<br>errno_t _localtime32_s(<br>   struct tm* _tm,<br>   const time32_t *time <br>);<br>errno_t _localtime64_s(<br>   struct tm* _tm,<br>   const _time64_t *time <br>);<br><br>clock函数<br>头文?<time.h><br>clock_t clock( void );<br><br><br><img src ="http://www.shnenglu.com/walkspeed/aggbug/24586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-22 10:00 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/22/24586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>输入的d操作中一些要心的地?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/20/24432.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sun, 20 May 2007 04:06:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/20/24432.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/24432.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/20/24432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/24432.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/24432.html</trackback:ping><description><![CDATA[输入的d多个字符的操作多用read?br>read的定义Ş式如?br>basic_istream& read( char_type *_Str, streamsize _Count );<br><br>char_type* 是流字符cd的指针,q个指针是用来存储要d的字W?br>的位|?br>streamsize 是存储空间大的cdQ多位long?br><br>重点在返回值的cdQ是一个输入流cd的应用。不是实际的d数据的长度?br>要获得实际的d长度要调?gcount函数。定义如?br>streamsize gcount( ) const;<br><br>要获得当前读取的位置要调用tellg函数。定义如?br>pos_type tellg( );<br>惌知道以一p取了多少数据可以用q个函数?br>tellg?x)蟩q格式符。即q回的位|是跌控制W的?br>q就是说几个gcount的和不一定等于tellg的倹{所?br>用来定d位置时一定要用tellg函数。而不能用<br>gcount的和Q在偏移Q这?x)生不对的位置?br><br>看下面的例子<br>int main( int argc, char* argv[] )<br>{<br>    std::ifstream ifile;<br><br>    char buf[10];<br><br>    ifile.open( "example.txt" ); //examplet.txt文g中每行有一个回车符<br><br>    ifile.read( buf, 10 );<br>    size_t size = ifile.tellg(); //size?1<br>    size = ifile.gcount(); //size?0<br><br>    ifile.read( buf, 10 );<br>    size = ifile.tellg(); //size?2<br>    size = ifile.gcount(); //size?0<br><br>    if( ifile.eof() )<br>    {<br>        return -1;<br>    }<br>    ifile.close();<br><br>    return 0;<br>}<br><br>dq程中可能会(x)出现问题Q流是不保证dq程的完整性。即要读多少数据Q?br>在对到这么多的数据后才返回?br>q要求编Eh员去判断的当前状态。再q行下面的处理?br><br>good函数知道当前状态是好的。即上一个操作成功。可以进行下一个操作?br>fail函数表示上一个操作失败。但还没有完全破坏Q可以进行一些处理?br>bad函数表示被破坏啦,别想了。不要在处理q个拉?br>eof函数表示已到的N。不用再往下读拉。不?x)读出数据的?br><br>int main( int argc, char* argv[] )<br>{<br>    std::ifstream ifile;<br><br>    char buf[10];<br><br>    ifile.open( "example.txt" ); //examplet.txt文g中每行有一个回车符<br>    ifile.seekg( 0, ios::end );<br>    ifile.close();<br>    <br>    ifile.open( "example.txt" );<br><br>    //q是成立的。说明状态ƈ没有应ؓ(f)文g的关闭而改变。只要这个对?br>    //的还?gu)zȝQ他的上一个状态将保持。而v?x)对下面的操作生媄响?br>    //除非你清除或修改了状态?br>    if( ifile.eof() ) <br>    {<br>        ifile.close();<br>        return -1;<br>    }<br>    <br>    ifile.close();<br><br>    return 0;<br>}<br> <br><img src ="http://www.shnenglu.com/walkspeed/aggbug/24432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-20 12:06 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/20/24432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用WTL作界面开?http://www.shnenglu.com/walkspeed/archive/2007/05/09/23694.htmlwalkspeedwalkspeedWed, 09 May 2007 03:59:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/09/23694.htmlhttp://www.shnenglu.com/walkspeed/comments/23694.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/09/23694.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/23694.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/23694.html
H口消息的映是通过宏MESSAGE_HANDLER完成的?br>MESSAGE_HANDLERQ?消息IDQ消息处理函?Q?br>自定义的消息也是通过q个宏来映射?br>
dH口消息函数后的对话框的定义如下
#include < atlapp.h >
#include "resource.h"

const int WM_MY_MESSAGE = WM_USER+1; //自定义消息ID

class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
    enum { IDD = IDD_MAINDLG };

public:
    BEGIN_MSG_MAP( CMainDialog )
        MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) //pȝ的窗口消息映,H口初始化消?br>        MESSAGE_HANDLER( WM_MY_MESSAGE, OnMyMessage ) //自定义消息的映射
        COMMAND_ID_HANDLER( IDOK, OnOk ) //控g消息的映?br>        COMMAND_ID_HANDLER( IDCANCEL, OnCancel )
        COMMAND_ID_HANDLER( IDC_SENDMESSAGE_BUTTON, OnSendMyMessage ) //用来发送自定义消息的按钮消息映?br>    END_MSG_MAP()

public:
    //H口初始化消息映函敎ͼq是个窗口系l消?br>    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        // center the dialog on the screen
        CenterWindow();

        return TRUE;
    }

    LRESULT OnOk( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
    {
        EndDialog( wID );
        return 0;
    }

    LRESULT OnCancel( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
    {
        EndDialog( wID );
        return 0;
    }

    //发送自定义消息
    LRESULT OnSendMyMessage( WORD wNotfyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
    {
        //ATL::CWindow的SendMessage的调?br>        SendMessage( WM_MY_MESSAGE );
        return 0;
    }

    //处理自定义消?br>    LRESULT OnMyMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
    {
        //ATL::CWindow的MessageBox的调?br>        MessageBox( "This is MyMessage Handle" ); //弹出个对话框
        return 0;
    }
};


walkspeed 2007-05-09 11:59 发表评论
]]>
用WTL作界面开?http://www.shnenglu.com/walkspeed/archive/2007/05/09/23690.htmlwalkspeedwalkspeedWed, 09 May 2007 03:18:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/09/23690.htmlhttp://www.shnenglu.com/walkspeed/comments/23690.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/09/23690.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/23690.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/23690.html要用到头文g atlapp.h

对话框的定义如下
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
    //用户代码
}

CDialogImplcLWTL中的模式对话框的基类。他利用了奇异自递归模板技术,来获得承类的实际行为?br>有了定义我们要给q个对话框一个窗口资源。很单,只要代码中定义一个IDD的枚N可以了?br>枚D量的gؓ(f)H口资源的ID。对话框的定义代码演化ؓ(f)如下
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
    enum { IDD=IDD_MAINDLG };//一定要在public域,否则没办法访问,~译时报?br>    //用户代码
}

p栯行编译,~译器会(x)报错Q说CMainDialog是个抽象c,不能实例化?br>其原因是ProessWindowMessage函数是个抽象地?br>我们是不是要手动dq个函数呢?可以。但对于~写代码来说q不方便?br>q里要用到ATL中的消息映射宏了?br>BEGIN_MSG_MAP( cd )
END_MSG_MAP()
有了q两个宏对后Q就自动的添加了ProessWindowMessage函数了,而且d消息映射的函C方便?br>现在对话框的定义代码演化为如下了
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
    enum { IDD=IDD_MAINDLG };//一定要在public域,否则没办法访问,~译时报?br>    
public:
    BEGIN_MSG_MAP( CMainDialog )
    END_MSG_MAP()
    //用户代码
}

有了以上代码Q对话框可以显现在屏幕上了。但是这个对话框没有办法推出Q应为没有一个消息映函数?br>接不到推出的消息?br>我们有添加两个消息映,分别对应界面上的OK按钮和Cancel按钮。这两个是button控gQ我们用控g的消息映?br>COMMAND_ID_HANDLER( ID, Fun )?br>d消息映射后的对话框类定义如下
#include < atlapp.h >
class CMainDialog : public CDialogImpl< CMainDialog >
{
public:
    enum { IDD=IDD_MAINDLG };//一定要在public域,否则没办法访问,~译时报?br>   
public:
    BEGIN_MSG_MAP( CMainDialog )
        COMMAND_ID_HANDLER( IDOK, OnOk )
        COMMAND_ID_HANDLER( IDCANCEL, OnCancel )
    END_MSG_MAP()
   
public:
    LRESULT OnOk( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
    {
        EndDialog( wID );//推出对话?br>        return 0;
    }

    LRESULT OnCancel( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled )
    {
        EndDialog( wID );//推出对话?br>        return 0;
    }
    //用户代码
};



walkspeed 2007-05-09 11:18 发表评论
]]>
用WTL作界面开?http://www.shnenglu.com/walkspeed/archive/2007/05/09/23685.htmlwalkspeedwalkspeedWed, 09 May 2007 02:42:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/05/09/23685.htmlhttp://www.shnenglu.com/walkspeed/comments/23685.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/05/09/23685.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/23685.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/23685.htmlint WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    //用户代码
    ...............
    return 0;
}

WTL是在ATL的基上发展v来的Q要用到ATL中的模块cCComModule,所以要初始化COM库?br>初始化COM库调用CoInitializeQ卸载COM库调用CoUninitialize。程序Ş式如?br>#include < atlbase.h >

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    CoInitializeQ?NULL Q?//用于应用E序
    //用户代码
    ...............
   
    CoUninitializeQ);
    return 0;
}

WTL的应用程序部分的代码装在了CAppModule中。要定义一个CAppModule的全局变量Q保证在E序启动前就被构造好
CAppModule是承的ATL中的CComModulecR程序Ş式演变成如下
#include < atlbase.h >
#include < atlapp.h > //WTL要用到的

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    CoInitializeQ?NULL Q?//用于应用E序
     _Module.Init( NULL, hInstance );//初始化一个应用程?br>    //用户代码
    ...............
    _Module.Term();//销?br>    CoUninitializeQ);
    return 0;
}


walkspeed 2007-05-09 10:42 发表评论
]]>
利用C++标准库中文g对象,如何获得文g的大?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23336.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 02 May 2007 09:04:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23336.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/23336.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/23336.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/23336.html</trackback:ping><description><![CDATA[    C++标准库中的文件流cL供的各种操作中没有直接获得正在操作的文g的大的函数。要获得文g大小得{个弯Q用如下的方?br>    假设我们有了一个已l打开的文件对象ifile?br>    先将文g内的位置指针Ud文g?br>    ifile.seekg( 0, ios::end );<br>    再读取当前位|,q就是文件的大小了?br>    long filelength = ifile.tellg();<br><br><img src ="http://www.shnenglu.com/walkspeed/aggbug/23336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-02 17:04 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/02/23336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++标准库中文g读取操作小l?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23335.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 02 May 2007 08:57:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23335.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/23335.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/23335.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/23335.html</trackback:ping><description><![CDATA[通过文g读取数?br>ifstreamcM表读文g对象Q所有的L作都在这个类中?br><br>read成员函数Q用来读取数据到指定的buf中?br>q个成员函数来至basic_istreamcR?br>函数原型Q来直MSDN文档Q?br>basic_istream& read( char_type *_Str, streamsize _Count );<br>_Str   字符指针<br>_Count 要读取的字符数量<br><br>get成员函数Q用来读取一个或多个字符<br>q个成员函数来至basic_istreamcR?br>函数原型Q来直MSDN文档Q?br>int_type get( ); d一个字W,不过是作为intcdq回<br>basic_istream& get( char_type& _Ch ); d一个字W?br>basic_istream& get( char_type *_Str, streamsize _Count ); d指定数量的字W?br>basic_istream& get( char_type *_Str, streamsize _Count, char_type _Delim ); d指定数量的字W,但与C_Delim相同的字W就停止<br>basic_istream& get( basic_streambuf<Elem, Tr> *_Strbuf ); <br>basic_istream& get( basic_streambuf<Elem, Tr> *_Strbuf, char_type _Delim );<br><br>peek成员函数Q用来返回下一个字W,当不从istream的buf中移?br>q个成员函数来至basic_istreamlei?br>函数原型Q来至MSDN文档Q?br>int_type peek( );<br><br>getline成员函数Q用来读取一行数?br>q个成员函数来至basic_istreamc?br>函数原型Q来至MSDN文档Q?br>basic_istream& getline( char_type *_Str, streamsize _Count );<br>basic_istream& getline( char_type *_Str, streamsize _Count, char_type _Delim );<br><br>readsome成员函数Q用于读取指定数量的数据到buf?br>q个函数来至basic_istreamcR?br>函数原型Q来至MSDN文档Q?br>streamsize readsome( char_type *_Str, streamsize _Count );<br><br>>>q算W重?br>对C++基本cdq行了重载操作。可以直接读取这些数据。但?x)蟩q控制字W?br>用户可以扩展q个q算W操作的cd?br>q个d是有cd的?br><br> <br><img src ="http://www.shnenglu.com/walkspeed/aggbug/23335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-02 16:57 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/02/23335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++标准库中文g基本操?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23325.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 02 May 2007 05:31:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23325.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/23325.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/05/02/23325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/23325.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/23325.html</trackback:ping><description><![CDATA[C++ STL中的Ҏ(gu)件操作的c?br>ifstream 用于L?br>ofstream 用于写文?br>fstream  用于d文g<br><br>打开文g<br>可以在够高文件流对象时直接打开<br>ifstream ifile( 文g?)<br>ofstream ofile( 文g?)<br>fstream  file( 文g?)<br><br>也可以用open行ؓ(f)<br>ifstream ifile<br>ifile.open( 文g?)<br>ofstream ofile<br>ofile.open( 文g?)<br>fstream file<br>file.open( 文g?)<br><br>关闭文g<br>文g对象销毁时自动关闭文g?br>也可用close关闭文g?br>ifile.close()<br>ofile.close()<br>file.close()<br><br>文g大开攑ּ标致<br>q写标致定义在iso_basecM。分别如?br>in     打开Q用于读取(q是ifstream的缺省模式)<br>out    打开Q用于改写(q是ofstream的缺省模式)<br>app    写入是始l添加与<br>ate    打开文g之后令读写位|移x件尾?br>trunc  先前的文g内容U除<br>binary 二进制方式打开<br>q些标致和或在一赗?br>q些标致作ؓ(f)对象构造或open行ؓ(f)的第二个参数Q来定义文g打开分方式?br><br>随机存储<br>用于L件的随机存储<br>tellgQ)     q回d的位|?br>seekg( pos )  从当前位|移动pos个位子(l对U送)<br>seekg( offset, rpos )  以rpos位置开始移动offset个位|(相对UdQ?br><br>用于写文件的随机存储<br>tellp()       q回写入的位|?br>seekp( pos )  从当前位|移动pos个位子(l对U送)<br>seekp( offset, rpos )  以rpos位置开始移动offset个位|(相对UdQ?br><br>L?br>利用read行ؓ(f)<br>ifstream ifile<br>ifile.readQbuf,lengthQ?br><br>写数?br>利用write行ؓ(f)<br>ofstream ofile<br>ofile.writeQbuf,lengthQ?   <br> <img src ="http://www.shnenglu.com/walkspeed/aggbug/23325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-02 13:31 <a href="http://www.shnenglu.com/walkspeed/archive/2007/05/02/23325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Signal中用来管理slot的管理器http://www.shnenglu.com/walkspeed/archive/2007/04/25/22803.htmlwalkspeedwalkspeedWed, 25 Apr 2007 07:18:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/04/25/22803.htmlhttp://www.shnenglu.com/walkspeed/comments/22803.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/04/25/22803.html#Feedback1http://www.shnenglu.com/walkspeed/comments/commentRss/22803.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/22803.htmlSignal?x)安优先U的不同来调用不同组?/span>slot。这栯?/span>signal能根据不同的优先U来理slotl。典型的实现Ҏ(gu)是用std::map。将其定义ؓ(f)如下形式std::map< int, slot >。由于每个优先下可能有一l?/span>slotQ所以要这一l?/span>slotl织CL(fng)理,?/span>boost signal中?/span>std::list来管理,其可能的形式大体如下std::list< slot >。这样就要修改刚才定义的map了,修改后的map可能的定义如?/span>std::map< int, std::list< slot > >?/span>

      在实际的boost signal中ƈ没有直接的存?/span>slotQ?/span>boost signal库中有个slotc)Q而是存储?/span>functionQ?/span>boost functioncȝ对象Q对象。而且Z方便控制signal?/span>function之间的联p,引入?/span>connectionc,用来表示signal?/span>function之间的联pR?/span>Connection的对象当然和一?/span>function攑֜了一赗这?/span>boost signal提供了一?/span>connection_slot_paircL存储一?/span>function?/span>connection寏V这样在boost signal中一?/span>slotl的实际定义如下std::list< connection_slot_pair >。ƈ且被重定义ؓ(f)group_listcdQ?/span>typedef std::list<connection_slot_pair> group_listQ。相应的?/span>boost signal?/span>map的实际定义如?/span>std::map<stored_group, group_list, compare_type>Qƈ且被重定义ؓ(f)slot_container_typeQ?/span>typedef std::map<stored_group, group_list, compare_type> slot_container_typeQ。将以上的这些东西组l到一个类中,以便于管理。这个类是named_slot_map?/span>Signal中真正用来管?/span>slot的管理器?/span>

         Named_slot_map的类数据成员如下定义Q?/span>boost源码中的一部分Q数据成员部分)

 

class BOOST_SIGNALS_DECL named_slot_map

{

public:

typedef named_slot_map_iterator iterator;//named_slot_map容器的P代器

private:

typedef std::list<connection_slot_pair> group_list;//function connection对组cd

typedef std::map<stored_group, group_list, compare_type> slot_container_type;//容器cd

typedef slot_container_type::iterator group_iterator;//容器q代器类?/span>

typedef slot_container_type::const_iterator const_group_iterator;

 

slot_container_type groups;//定义一个用来管?/span>function connectionl的容器对象

group_iterator back;//容器的P代器对象

};

 

         Named_slot_map也是一个容器?/span>Stl的容器ؓ(f)了外界方便访问容器内数据单元Q提供了q代器?/span>Named_slot_map也有自己的P代器。这个P代器是named_slot_map_iteratorcR?/span>Named_slot_map提供了以下方法来获得q代?/span>iterator begin()Q?/span>iterator end()?/span>BeginҎ(gu)提供首P代器Q?/span>endҎ(gu)提供P代器。向容器中插入数据用insert。清除某个数据用而而然eraseQ清I容器中的所有数据用clear?/span>



walkspeed 2007-04-25 15:18 发表评论
]]>
由signal的一些东西联惛_了AMhttp://www.shnenglu.com/walkspeed/archive/2007/04/24/22756.htmlwalkspeedwalkspeedTue, 24 Apr 2007 11:36:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/04/24/22756.htmlhttp://www.shnenglu.com/walkspeed/comments/22756.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/04/24/22756.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/22756.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/22756.html  boost signal中的signal的模板参数是个函数类型。可以将其看成一个接口。signal对象依赖q个接口Q而且是有signal定义的。具体类d现镇歌接口Q即实现q个函数cdQ?br>  signal和slot框架l成了一个observer模式的实现。signal是出版者,slot是订阅?

walkspeed 2007-04-24 19:36 发表评论
]]>
奇怪于signal中的slotcȝ用?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/04/23/22654.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Mon, 23 Apr 2007 08:57:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/04/23/22654.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/22654.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/04/23/22654.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/22654.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/22654.html</trackback:ping><description><![CDATA[<p>  本以为slot是被signal存储q管理的slot。但是通过解读boost的源代码发现q个cdƈ没有被signal直接理Q而仅仅用来构造了下connection。没有发现其他的用途。如果这P那ؓ(f)何不直接在signal的connect中直接进行connection的构造呢?br>  signal的connect函数没有直接接收function对象Q而是接收的slot<>对象Q而slot<>对象用来接收function。这个function看来未必一定是个函数对象了。可以是个原始函数或cdC?q个猜测要证实了才能定。即便如此,q个cȝ作用是有限的。不q关于那个tackeable的用法还没有完全高清楚,可能那是q个cd在的理由Q也总后会(x)有什么的发展。但现在实看不Z么大的用途?br>  奇怪于Z在signal中的slot理器,不去直接理slot<>的实例,而是理connection和function的pair?/p> <p>  个h觉得在slot<>中的最有用处的函数?br>void slot_base::create_connection()<br>{<br> basic_connection* con = new basic_connection();</p> <p> {<br>  con->signal = static_cast<void*>(this);<br>  con->signal_data = 0;<br>  con->blocked_ = false ;<br>  con->signal_disconnect = &bound_object_destructed;<br> }<br> <br> data->watch_bound_objects.reset(con);</p> <p> scoped_connection safe_connection(data->watch_bound_objects);</p> <p> for(std::vector<const trackable*>::iterator i = data->bound_objects.begin();<br>  i != data->bound_objects.end(); ++i) <br> {<br>  BOOST_SIGNALS_NAMESPACE::detail::bound_object binding;<br>  (*i)->signal_connected(data->watch_bound_objects, binding);</p> <p>  BOOST_SIGNALS_NAMESPACE::detail::auto_disconnect_bound_object disconnector(binding);</p> <p>  con->bound_objects.push_back(binding);<br>  disconnector.release();<br> }</p> <p> safe_connection.release();<br> data->watch_bound_objects.set_controlling(true);<br>}</p> <img src ="http://www.shnenglu.com/walkspeed/aggbug/22654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-23 16:57 <a href="http://www.shnenglu.com/walkspeed/archive/2007/04/23/22654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>得到cL据成员的位置http://www.shnenglu.com/walkspeed/archive/2007/04/08/21486.htmlwalkspeedwalkspeedSun, 08 Apr 2007 02:54:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/04/08/21486.htmlhttp://www.shnenglu.com/walkspeed/comments/21486.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/04/08/21486.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/21486.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/21486.html     
        (size_t)&(((classname*)0)->members)

        classname 是一个类名,members是类中Q何一个数据成员的名字?在这里是一个地址Q这是一个保留地址Q它不能作ؓ(f)左|但可以作为右|L取其中的对象?br>        ?地址位,构造了一个classname的结构布局?br>
        在用中Lơ写q个表达式还是很ȝ的。可以用个宏其包v来,如下

        #difine offsetof( ClassName, MemberName ) (size_t)&(((classname*)0)->members)

        其实q个宏在windows和linuxq_下都以提供了?

walkspeed 2007-04-08 10:54 发表评论
]]>
看来的东襉K?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21457.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 07 Apr 2007 08:28:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21457.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/21457.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/21457.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/21457.html</trackback:ping><description><![CDATA[<p>        以下的东西是我在|上看到的东西,摘抄下来的,忘了出处。先向A(ch)献者表C感?br><br>        thinking in c++ 之static结<br>本的含义是:(x)“位置不变的某个东?#8220;Q这里指的是内存中的位置或者文件中的可见?br>1Q在c和c++中,static的两U含义:(x)<br>Q?Q,静态存储?br>Q?Q,对一个特定的~译单元来说是本地的Q这个名字在q个单元或类之外不可见?/p> <p>2Qstatic对象存储在E序的静态存储区中,而不是在堆栈中。这个对象只在汉书第一ơ调用是初始化,其后不用再初始化?/p> <p>3Q对于静态对象的初始化,零赋值只寚w定义对象有效Q用戯定义的类型必ȝ构造函数初始化?/p> <p>4Q静态对象的析构函数在程序的main()函数退出时Q或者标准c函数exit()调用时才被调用。在析构函数中调用exit()是很危险的,因ؓ(f)q样可能引vd@环?/p> <p>5Q静态对象的销毁是按它们初始化的相反顺序进行的。全局对象L在main()执行之前被创建。如果一个包含静态对象的函数从没有被调用q,那么q个对象的构造函数就没有被执行,所以也׃?x)调用析构函?/p> <p>6Q一个被明确声明为static的对象或函数的名字对~译单元来说是局部变量,q些名字有内部连接。类声明和局部变量没有联接?/p> <p>7Qextern表示该名字对所有的~译单元是可见的Q用static和extern限定的对象Lȝ在静态数据区</p> <p>8Q普通函数是外部q接?/p> <p>9Q类的静态成员拥有一块单独的存储?而不我们创Z多少个该cȝ对象Q这׃ؓ(f)q些了创Z一个通信的方法?/p> <p>10Q静态成员的定义必须出现在外部,而且只能有一?/p> <p>11Q一个类的静态常量可以被用作一个编译时帔R</p> <p>12Q在局部类(在函数内部定义的c)中不能有静态数据成员?/p> <p>13Q静态成元函敎ͼ(x)<br>Q?Q,静态成元函Cؓ(f)该类的全体服务,而不是ؓ(f)cȝ部分对象服务Q?br>Q?Q?静态成员函C能访问一般的数据成员Q只能访问静态数据成员,q且只能调用静态成元函数?/p> <p>14Qؓ(f)什么静态成元函C能访问一般的数据成员Q也不能调用普通的成员函数?<br>׃当前对象的地址是被隐藏的传递给被调用的函数的,׃静态成员函C是某个对象独有的Q所以没有this指针Q所以无法调用调用普通成员函敎ͼ同样Ҏ(gu)通成员变量的讉K也用Cthis指针?br><br>        ~译单元<br>l过预处理之后的文gQ这个是内存中的临时文gQ?br>#include在预处理时被展开Q宏也一?/p> <p>一个经q展开后的.cpp文g是一个编译单?/p> <p>一个xx.hQ经q预处理Q?+ 一个xx.cpp = 一个编译单?br>一个编译单元(l过~译Q? xx.obj<br>整个E序的多?obj加v?l过链接) = .exeQ可执行文gQ?</p> <p><br>预处?br>-----------<br>把一些带#L(fng)Q比方说宏定义,预处理命令(#includeQ等 <br><br>        内部q接与外部连?br>在说内部q接与外部连接前Q先说明一些概c?</p> <p>  1.声明</p> <p>  一个声明将一个名U引入一个作用域;</p> <p>  在c++中,在一个作用域中重复一个声明是合法?</p> <p><br>  以下都是声明Q?</p> <p>int foo(int,int); //函数前置声明 </p> <p>typedef int Int; //typedef 声明 </p> <p>class bar; //cd|声?</p> <p>extern int g_var; //外部引用声明 </p> <p>class bar; //cd|声?</p> <p>typedef int Int; //typedef 声明 </p> <p>extern int g_var; //外部引用声明 </p> <p>friend test; //友员声明 </p> <p>using std::cout; //名字I间引用声明</p> <p>friend test; //友员声明 </p> <p>using std::cout; //名字I间引用声明</p> <p>int foo(int,int); //函数前置声明  </p> <p>  在同一个作用域中你可以多次重复q些声明?</p> <p>  有两U声明不能重复,那就是类成员函数?qing)静态数据成员的声明</p> <p>class foo <br>{ <br> static int i; <br> static int i;//不可?<br> public: <br>  int foo(); <br>  int foo();//不可?<br>};</p> <p>2.定义</p> <p>  一个定义提供一个实?cd、实例、函?在一个作用域的唯一描述?/p> <p>  在同一作用域中不可重复定义一个实体?/p> <p>  以下都是定义?/p> <p>int y;</p> <p>class foo ;</p> <p>struct bar ;</p> <p>foo* p;</p> <p>static int i;</p> <p>enum Color;</p> <p>const double PI = 3.1415;</p> <p>union Rep;</p> <p>void test(int p) {};</p> <p>foo a;</p> <p>bar b; </p> <p>  3.~译单元</p> <p>  当一个c或cpp文g在编译时Q预处理器首先递归包含头文Ӟ形成一个含有所有必要信息的单个源文?q个源文件就是一个编译单元。这个编译单元会(x)被编译成Z个与cpp文g名同名的目标文g(.o或是.obj)。连接程序把不同~译单元中生的W号联系hQ构成一个可执行E序?/p> <p>  4.自由函数</p> <p>  如果一个函数是自由函数Q那么这个函C是类的成员函敎ͼ也不是友元函数?/p> <p>  下面来看内部q接和外部连?/p> <p>  内部q接Q如果一个名U对于它的编译单元来说是局部的Qƈ且在q接时不?x)与其它~译单元中的同样的名U相冲突Q那么这个名U有内部q接(注:(x)有时也将声明看作是无q接的,q里我们l一看成是内部连接的)?/p> <p>  以下情况有内部连?</p> <p>  a)所有的声明</p> <p>  b)名字I间(包括全局名字I间)中的静态自由函数、静态友元函数、静态变量的定义</p> <p>  c)enum定义</p> <p>  d)inline函数定义(包括自由函数和非自由函数)</p> <p>  e)cȝ定义</p> <p>  f)名字I间中const帔R定义</p> <p>  g)union的定?/p> <p>  外部q接:在一个多文gE序中,如果一个名U在q接时可以和其它~译单元交互Q那么这个名U就有外部连接?/p> <p>  以下情况有外部连?</p> <p>  a)c非inline函数L外部q接。包括类成员函数和类静态成员函?/p> <p>  b)c静态成员变量L外部q接?/p> <p>  c)名字I间(包括全局名字I间)中非静态自由函数、非静态友元函数及(qing)非静态变?/p> <p>  下面举例说明Q?/p> <p>  a)声明、enum定义、union定义有内部连?/p> <p>  所有的声明、enum定义?qing)union定义在编译后不会(x)产生q接W号Q也是在不同编译单元中有相同名U的声明?qing)enum、union定义q不?x)在q接时发生发现多个符L(fng)错误?/p> <p>// main.cpp</p> <p>typedef int Int; //typedef 声明Q内部连?/p> <p>enum Color; //enum定义,内部q接</p> <p>union X //union定义Q内部连?br>{<br> long a;<br> char b[10];<br>};</p> <p>int main(void)<br>{<br>Int i = red;<br>return i;<br>}</p> <p>// a.cpp</p> <p>typedef int Int; //在a.cpp中重声明一个intcd别名Q在q接时不?x)发生错?br>enum Color; //在a.cpp中重定义了一个enum ColorQ在q接时不?x)发生错?br>const Int i =blue; //const帔R定义Q内部连?br>union X //union定义Q内部连?br>{<br> long a;<br> char b[10];<br>}; </p> <p>  b)名字I间中静态自由函数、静态友元函数、静态变量、const帔R定义有内部连?/p> <p>// main.cpp</p> <p>namespace test<br>{<br> int foo(); //函数声明Q内部连?br> static int i = 0; //名字I间静态变量定义,内部q接<br> static int foo() { return 0;} //名字I间静态函数定义,内部q接<br>}</p> <p>static int i = 0; //全局静态变量定义,内部q接<br>static int foo() {return 1;} //全局静态函数定义,内部q接<br>const int k = 0; //全局const帔R定义Q内部连?br>int main(void)<br>{<br> return 0;<br>}</p> <p>//a.cpp</p> <p>namespace test<br>{<br> int i = 0; //名字I间变量定义Q外部连?br> int foo() {return 0;} //名字I间函数定义Q外部连?br>}</p> <p>int i = 0; //全局变量定义Q外部连?br>int k = 0; //全局变量定义Q外部连?br>int foo() { return 2;} //全局函数定义Q外部连?</p> <p>  在全局名字I间中,main.cpp中定义了静态变量i,帔Rk,?qing)静态自由函数foo{,q些都有内部q接。如果你这些变量或函数的static或是const修饰W去掉,在连接时׃(x)现multiply defined symbols错误Q它们与a.cpp中的全局变量、全局函数发生冲突?/p> <p>c)cd义L内部q接,而非inlinecL员函数定义L外部q接Q不个成员函数是静态、虚拟还是一般成员函敎ͼc静态数据成员定义L外部q接?</p> <p>  1.cȝ定义有内部连接。如果不是,惌一下你?个cpp文g中include定义了类Base的头文gQ在4个编译单元中的类Base都有外部q接Q在q接的时候就?x)出错?/p> <p>  看下面的例子:</p> <p>//main.cpp</p> <p>class B //cd义,内部q接<br>{<br> static int s_i; //静态类成员声明Q内部连?<br> public:<br>  void foo() { ++s_i;} //cinline函数Q内部连?br>};<br>struct D <br>{<br> void foo(); //cL员函数声明,内部q接<br>};</p> <p>int B::s_i = 0; //c静态数据成员定义,外部q接<br>void D::foo() //cL员函数定义,外部q接<br>{ <br> cout << "D::foo in main.cpp" <<br>}</p> <p>int main() //main函数Q全局自由函数Q外部连?br>{<br> B b;<br> D d;<br> return 0;<br>}</p> <p>//a.cpp</p> <p>class B<br>{<br> int k;<br>};</p> <p>struct D<br>{<br> int d;<br>};  </p> <p>  在这个例子中Qmain.cpp与a.cpp中都有class B和class D的定义,但在~译q两个cpp文g时ƈ不发生link错误?/p> <p>  2.cȝ非inline成员函数(一般,静态,虚拟都是)L外部q接Q这样当你include了某个类的头文gQ用这个类的函数时Q就能连接到正确的类成员函数上,l箋以上面ؓ(f)例子Q如果把a.cpp中的struct D改ؓ(f)</p> <p>struct D //cd?br>{<br> int d;<br> void foo(); //cL员函数声?br>};<br>void D::foo() //cL员函数定义,外部q接<br>{<br> cout << " D::foo in a.cpp" <<br>}  </p> <p>  q时main.cpp与a.cpp中的D::foo都有外部q接Q在q接׃(x)出现multiply defined symbols错?</p> <p>  3.cȝ静态数据成员有外部q接Q如上例的B::s_i,q样当你在main.cpp中定义了c静态数据成员,其它~译单元若用了B::s_i,׃(x)q接到main.cpp对应~译单元的s_i?/p> <p>  d)inline函数L内部q接Q不个函数是什么函?/p> <p>// main.cpp</p> <p>inline int foo() { return 1;} //inline全局函数Q内部连?br>class Bar //cd义,内部q接<br>{<br> public:<br>  static int f() { return 2;} //inline c静态函敎ͼ内部q接<br>  int g(int i) { return i;} //inline cL员函敎ͼ内部q接<br>};</p> <p>class Base<br>{<br> public:<br>  inline int k()Q?//cL员函数声明,内部q接<br>}Q?/p> <p>inline int Base::k(){return 5;} //inline cL员函敎ͼ内部q接<br>int main(void)<br>{<br> return 0;<br>} </p> <p>  如果你的BasecL定义在Base.h中,而Base的inline 函数是在Base.cpp中定义的Q那么在main.cpp中include "Base.h"~译不会(x)出现问题Q但在连接时?x)找不到函数kQ所以类的inline函数最好放到头文g中,让每一个包含头文g的cpp都能扑ֈ inline函数?/p> <p>  现在对c++中的q接有了一个认识,能清楚的知道是什么原因生连接时错误。当你在q接时生连接不到的错误Q这说明所有的~译单元都没有这个实体的外部q接Q当你在q接时发现有多个q接实体Q这说明有多个编译单元提供了同名的有外部q接的实体。同Ӟ在进行程序设计时Q也要注意不要只有本编译单元用到的函数、类、变量等有外部连接,减少与其它编译单元的q接冲突?/p> <p>  不过在这里没有说明template函数?qing)template class的连接性,q且对一些特别的情况也没有作?比如inline函数不能被inline)?br></p> <img src ="http://www.shnenglu.com/walkspeed/aggbug/21457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-07 16:28 <a href="http://www.shnenglu.com/walkspeed/archive/2007/04/07/21457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~译单元的理?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21456.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 07 Apr 2007 08:24:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21456.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/21456.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21456.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/21456.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/21456.html</trackback:ping><description><![CDATA[<p>        ~译单元Q是代码的物理组lŞ式。有时在单个?#8216;.h’?#8216;.cpp’的编写中看没有问题的代码Q在~译单元中就是有问题的。特别是软g规模大时?br><br>~译器不?x)去~译'.h'或?.hpp'文g?br>~译器只?x)编?.c'?.cpp'文g?/p> <p>'.h'?.hpp'里的代码?x)?include宏添加到'.c'?.cpp'文g中?br>q个q程发生在预~译期,预编译器Q现在好像没有这个东西了Q都<br>在编译器中完成)完成q䆾工作?/p> <p>一?.c'?.cpp'是一个编译单元。编译器其译成二q制代码?/p> <img src ="http://www.shnenglu.com/walkspeed/aggbug/21456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-07 16:24 <a href="http://www.shnenglu.com/walkspeed/archive/2007/04/07/21456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Metafunction 原操?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21454.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 07 Apr 2007 08:20:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21454.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/21454.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/04/07/21454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/21454.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/21454.html</trackback:ping><description><![CDATA[<p>        q是我在看boost MPL时试着译的东西,现在贴上来?br><br>A metafunction is a class or a class template that represents a function invocable at compile-time. <br>一个原操作是在~译器表C调用操作的一个类或一个模板类?/p> <p>An non-nullary metafunction is invoked by instantiating the class template with particular template parameters (metafunction arguments); <br>一个非无参的原操作被一个有详细模板参数的模板类hQ?br>the result of the metafunction application is accessible through the instantiation's nested type typedef. <br>原操作应用的q回值是一个通过模板cd例可取的内嵌的类型定义?/p> <p>All metafunction's arguments must be types (i.e. only type template parameters are allowed). <br>所有的原操作的参数必须是类型?/p> <p>A metafunction can have a variable number of parameters. <br>一个原操作能有一个数量变化的参数</p> <p>A nullary metafunction is represented as a (template) class with a nested type typename member.<br>一个无参数原操作被表现为有内嵌重命名类型的c?/p> <p>原操作的三种表达式(f是一个原操作Q?br>1 f::type<br>2 f<>::type<br>3 f< a1,..,an >::type</p> <p><br>Lambda Expression 构造和分配表达?/p> <p>A Lambda Expression is a compile-time invocable entity in either of the following two forms:<br>一个构造和分配表达式是下面两个中的一个编译期调用单元</p> <p>Metafunction Class<br>原操作类</p> <p>Placeholder Expression <br>站位W表辑ּ</p> <p>Most of the MPL components accept either of those, and the concept gives us a consice way to describe these requirements.<br>大部分的MPLlg接收它们其中一个,</p> <img src ="http://www.shnenglu.com/walkspeed/aggbug/21454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-07 16:20 <a href="http://www.shnenglu.com/walkspeed/archive/2007/04/07/21454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.hnhanzhi.com.cn" target="_blank">þ99Ʒ99þ6</a>| <a href="http://www.pk9777.cn" target="_blank">þþƷav</a>| <a href="http://www.udyq.cn" target="_blank">þþһ</a>| <a href="http://www.cn0317.cn" target="_blank">ҹƷþþþó</a>| <a href="http://www.dgchengxin.cn" target="_blank">ۺϾƷ㽶þ97</a>| <a href="http://www.shishanfz.cn" target="_blank">ҹþþþüŮӰԺ </a>| <a href="http://www.6kun.cn" target="_blank">91þþþþۺ</a>| <a href="http://www.qinhaichang.cn" target="_blank">þùɫavѿ</a>| <a href="http://www.pobk.cn" target="_blank">žžƷþþþþ</a>| <a href="http://www.imlee.com.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.0751seo.cn" target="_blank">þûɫƵ</a>| <a href="http://www.7cdy.cn" target="_blank">þľƷĻ</a>| <a href="http://www.ntysjx.cn" target="_blank">ܻƺ۵վþmimiɫ</a>| <a href="http://www.hy129.cn" target="_blank">þþƷWWW456C0M</a>| <a href="http://www.bainiu168.cn" target="_blank">þþƷƷƾ</a>| <a href="http://www.audtw.cn" target="_blank">þþƷ</a>| <a href="http://www.taozhenyuan.cn" target="_blank">þþþ?V</a>| <a href="http://www.wuweibuzhi.cn" target="_blank">þþþþùƷŮ</a>| <a href="http://www.bestfanyi.cn" target="_blank">ۺѾƷþþ</a>| <a href="http://www.wufayulecheng.cn" target="_blank">ھƷþþþþòӰԺ </a>| <a href="http://www.pgos.com.cn" target="_blank">ƷþƷ </a>| <a href="http://www.yy1122.cn" target="_blank">Ʒ99þaaaһëƬ</a>| <a href="http://www.wooblog.cn" target="_blank">ƷѾþþþùһ</a>| <a href="http://www.9lang.cn" target="_blank">ձձȾþþƷ</a>| <a href="http://www.wendalaw.com.cn" target="_blank">޹պۺϾþþƷ</a>| <a href="http://www.taokecai.cn" target="_blank">þþƷav鶹ѿ</a>| <a href="http://www.jumeiba.cn" target="_blank">Ļþ</a>| <a href="http://www.0x5e.cn" target="_blank">ˮϵþþƷ</a>| <a href="http://www.021cp.cn" target="_blank">þþݾþþ</a>| <a href="http://www.peizis.cn" target="_blank">ھƷþþþþĻ</a>| <a href="http://www.shuntai.net.cn" target="_blank">ҹƵþþþһ</a>| <a href="http://www.shiweey.cn" target="_blank">þþAVҰ</a>| <a href="http://www.fozhun.cn" target="_blank">þóۺɫۺ</a>| <a href="http://www.yvhv.cn" target="_blank">˾þۺ</a>| <a href="http://www.hfko.cn" target="_blank">Ҫþðѹۿ</a>| <a href="http://www.zhe38.cn" target="_blank">þ޴ɫĻþþ </a>| <a href="http://www.mayingbao.cn" target="_blank">þĻԴվ</a>| <a href="http://www.mijie5.cn" target="_blank">޹˾þۺҰ</a>| <a href="http://www.t5573.cn" target="_blank">ձǿƬþþþþAAA</a>| <a href="http://www.commonsoft.cn" target="_blank">ھƷ˾þþþ</a>| <a href="http://www.ahlgw.cn" target="_blank">þۺϾþԾ99ëƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>