??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99国产精品二区不卡,狠狠久久综合伊人不卡,国产精品久久99http://www.shnenglu.com/yearner/智慧需要点滴的U篏zh-cnWed, 07 May 2025 04:12:12 GMTWed, 07 May 2025 04:12:12 GMT60关于MSVCRTD.lib的编译错?/title><link>http://www.shnenglu.com/yearner/archive/2010/07/14/120309.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Wed, 14 Jul 2010 03:30:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2010/07/14/120309.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/120309.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2010/07/14/120309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/120309.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/120309.html</trackback:ping><description><![CDATA[MFC的工E包smcinstQ编译后出现以下错误<br>MSVCRTD.lib(MSVCRTD.dll)   :   error   LNK2005:   _free   already   defined   in   libcmtd.lib(dbgheap.obj) <br>MSVCRTD.lib(MSVCRTD.dll)   :   error   LNK2005:   _malloc   already   defined   in   libcmtd.lib(dbgheap.obj) <br>....<br>LINK   :   warning   LNK4098:   defaultlib   "MSVCRTD "   conflicts   with   use   of   other   libs;   use   /NODEFAULTLIB:library <br>Debug/NKOTwain.ocx   :   fatal   error   LNK1169:   one   or   more   multiply   defined   symbols   found <br>Error   executing   link.exe. <br><br><br>标准E序库有关的选项: /ML?MLd?MT?MTd?MD?MDd?br>q些选项对应~译器应用程序所要用运行时C标准E序库?br>/ML(~省选项)对应单线E静态版的标准程序库(libc.lib)Q?br>/MT对应多线E静态版标准?libcmt.lib)Q此时编译器会自动定义_MT宏;<br>/MD对应多线EDLL?导入库msvcrt.libQDLL是msvcrt.dll)Q编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要用对应标准库的调试版Q因?MLd对应调试版单U程静态标准库(libcd.lib)Q?br>/MTd对应调试版多U程静态标准库(libcmtd.lib)Q?br>/MDd对应调试版多U程DLL标准?导入库msvcrtd.libQDLL是msvcrtd.dll)?br><br>因此Q上q的conflicts原因是出C对运行库版本调用的不一致?br>有怺调用关系的工E属?>代码生成->q行时库 讄成统一选项Q如 /mtd. <img src ="http://www.shnenglu.com/yearner/aggbug/120309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2010-07-14 11:30 <a href="http://www.shnenglu.com/yearner/archive/2010/07/14/120309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Quoted printable ~码说明http://www.shnenglu.com/yearner/archive/2008/11/20/67421.html(Leyn)主(Leyn)主Thu, 20 Nov 2008 13:46:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/20/67421.htmlhttp://www.shnenglu.com/yearner/comments/67421.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/20/67421.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/67421.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/67421.html

3.2      Quoted printable ~码

         QP ~码用于表示含有大量对应可打印字W的数组Q这U编码方式字符单元在传输过E中被更改的可能性很。如果正在编码的数据大部分是ASCII文本Q那么编码后的Ş式具有很高的可读性。一个完全是ASCII值的正文数据?/span>QP~码后可以保证数据在字符译或经qx数据的完整性?/span>

       ~码规则如下Q?/span>

       规则1Q?/span>(一?/span>8位组的表C方?/span>), M的八位组Q都可以?/span>”=”后加该八位组?/span>16q制值来表示Q除了那些根据数据编码规范中新行的惯例来指定短行的表C单位。必ȝ大写字母。比如值是12 Q则表示?/span>”=0C”?/span>

       规则2Q?/span>(文字表示)值在33-60 Q以?/span>62-126的八位组(包含头尾?/span>)Q可以表C成那些八位l对应的ASCII字符?/span>

       规则3Q?/span>(I格) 值是9?/span>32的八位组可以分别表示?/span>ASCII ?/span>TAB?/span>SPACE|但是不可以出现在~码行的末尾。Q何在~码行的TAB?/span>SPACE字符必须后面有可打印字符出现。特D情况下Q编码行的末և现的”=”Q表C断行,其前面可能是一个或多个TAB?/span>SPACE?/span> 实行q条规则的原因是一?/span>METs(Message Transport Agents-消息传输单元)会在文本末尾补上SPACEQ因此,解码ӞM跟在行后的空格必d除?/span>

       规则4Q?/span>(断行)在原文中的断行必表C成协议中的断行W?/span>-CRLF序列Q?/span>"=0D=0A” Q?/span>。由于非文本cd的规范表CZ般不包括断行Q所以这U类型的qp~码没有换行。通常Q?/span>base64~码在二q制~码上更占优ѝ?/span>

       规则5Q?/span>(软换?/span>)QP~码要求~码后每行不能超q?/span>76个字W。当过q个限制Ӟ适用软换行,?/span>”=”表示~码行的断行Q后?/span>CRLF。(76的限制包?/span>”=”Q?/span>

      



(Leyn)主 2008-11-20 21:46 发表评论
]]>
Base 64 ~码说明http://www.shnenglu.com/yearner/archive/2008/11/20/67418.html(Leyn)主(Leyn)主Thu, 20 Nov 2008 13:45:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/20/67418.htmlhttp://www.shnenglu.com/yearner/comments/67418.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/20/67418.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/67418.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/67418.html阅读全文

(Leyn)主 2008-11-20 21:45 发表评论
]]>
MIME邮g格式说明http://www.shnenglu.com/yearner/archive/2008/11/20/67417.html(Leyn)主(Leyn)主Thu, 20 Nov 2008 13:44:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/20/67417.htmlhttp://www.shnenglu.com/yearner/comments/67417.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/20/67417.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/67417.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/67417.html阅读全文

(Leyn)主 2008-11-20 21:44 发表评论
]]>
[?]谈C++的智能指?http://www.shnenglu.com/yearner/archive/2008/11/09/66447.html(Leyn)主(Leyn)主Sun, 09 Nov 2008 12:43:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/09/66447.htmlhttp://www.shnenglu.com/yearner/comments/66447.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/09/66447.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/66447.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/66447.html谈C++的智能指?/h1>
内存泄露是C++E序员都头疼的大问题。C++~Z像JAVA、C#一P拥有GCq么一Ҏ利的武器Q它内存管理的部分权限交给了程序员。虽然GC的存在节U了开发、排错的旉与成本,但是C++Zq求q行速度?0q来坚决不予补充q其标准。(题外话:C++通过加大开发难度去换取执行速度的做法,在现在看来不知是否能l与正面的评Pq是留给来再说吧。)

  从此Q在堆上甌了内存忘了释放、所造成的内存泄露的问题׃直困扰着C++E序员。也ؓ了稍许I补没有垃圑֛收器所造成的开发门槛高Q各大厂商开发的C++库中都像COM学习引入指针试图解决部分目前存在的问题?br>
  指针是存储指向动态分配(堆)对象指针的类, 用于生存期控? 能够保自动正确的销毁动态分配的对象Q防止内存泄霌Ӏ它的一U通用实现技术是使用引用计数(reference count)。智能指针类一个计数器与类指向的对象相兌Q引用计数跟t该cL多少个对象共享同一指针。每ơ创建类的新对象Ӟ初始化指针ƈ引用计? |ؓ1Q当对象作ؓ另一对象的副本而创建时Q拷贝构造函数拷贝指针ƈ增加与之相应的引用计敎ͼ对一个对象进行赋值时Q赋值操作符减少左操作数所指对象的? 用计敎ͼ如果引用计数为减?Q则删除对象Q,q增加右操作数所指对象的引用计数Q调用析构函数时Q构造函数减引用计敎ͼ如果引用计数减至0Q则删除? 对象Q?br>
  说到指针Q我们一定要看看标准C++库提供的“搞笑?#8221;指针:auto_ptr?br>
  标准库中提供了C++E序的基本设施。虽然C++标准库随着C++标准折腾了许多年Q直到标准的出台才正式定型,|上评论C++标准库时都说Q?#8220;在标准库 的实C却很令hƣ慰得看到多U实玎ͼq且已被实践证明为有工业U别强度的佳作?#8221;但目前的标准C++中,只有一U独苗智能指 针:std::auto_ptr?br>
  auto_ptr指针是一个RAII对象,它初始化时获得资?析构时自动释放资?生命期结?.它的~点C胜数Q?br> 1、auto_ptr要求一个对象只能有一个拥有者,严禁一物二?br> 2、缺对引用数和数组的支持?br> 3、不可将auto_ptr对象作ؓSTL容器的元素。C++标准明确止q样做,否则可能会碰C可预见的l果。(q一条晕M大片Q?br>4、auto_ptr在被复制的时候会传输所有权

反正由此可见Q标准库的智能指针就是无甚大用?br>
    在这L情况下,C++标准委员会自焉要考虑引入新的指针。目前由C++标准委员会库工作l发LBoost l织开发了Boostpd指针?br>
  在Boost中的指针有五U: scoped_ptrQscoped_arrayQshared_ptrQshared_arrayQweak_ptr.

?U完全是针对标准库中的auto_ptr提出解决ҎQ如Qscope_ptr是针?#8220;auto_ptr在被复制的时候会传输所有权”q一q提出的。最后一U没见过Q看名字像是弱引用智能指针,我怀?span onclick="sendmsg('pw_ajax.php','action=relatetag&tagname=是不?,this.id)" style="border-bottom: 1px solid #fa891b; cursor: pointer;" id="rlt_3">是不?/span>cM于JAVA中弱引用一?有待q一步学习?/div>

(Leyn)主 2008-11-09 20:43 发表评论
]]>[转]C++中的指针--指针http://www.shnenglu.com/yearner/archive/2008/11/09/66445.html(Leyn)主(Leyn)主Sun, 09 Nov 2008 12:37:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/09/66445.htmlhttp://www.shnenglu.com/yearner/comments/66445.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/09/66445.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/66445.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/66445.htmlSmart Pointer?a class="channel_keylink">C++中的一个大题目Q要说清楚他的所有好处很需要费点力气。我׃个功能一个功能的说。有我理解不透的地方希望大家指点?br>
1.copy-to-write
当生成一?a class="channel_keylink">C++ object的时候如果这个class很大Q这个object会占用很多空间。那么每生成一个就占用一片空_q样会占用很多系l资源。同旉低效率。一个解x法就是对用拷贝构?a class="channel_keylink">函数生成的objectQ让他不存储数据Q而只存储一个指向原来object数据?a class="channel_keylink">指针?q样I间p省了很多。但问题在于q样两个object完全联结在了一赗如果修改了其中一个,另一个也跟着变了。所以这U方法不可取。这里讲?copy-to-write技术就是解册c问题的Ҏ。当通过引用一个已有objectL贝构造新objectӞ新object只有一个指向已?object?a class="channel_keylink">指针? q两个object׃n数据。直到其中一个需要修Ҏ据的时候,再把q两块数据分R这里D一个最化的例子。假设一个class? CLargeObjectQ里面存有很多数据。我们用一个inner class来把所有数据放在一P叫CData。CData里面存有大量数据Q例如一?a class="channel_keylink">数据?/a>。这里用最单的模型来表C,假设只有一个整数int m_nVal; CData里面需要包含另一个变量。叫作烦引数?reference count)。它记录了指向这个CData object的来自CLargetObjectcȝ指针各数。也是_d有多CLargeObject的object正在引用着当前的CData object?br>
class CLargeObject
{
private:
    struct CData
    {
    private:
        int m_nVal;
        int m_nReferenceCount;
    }
};

对于每个CLargeObject的objectQ我们用一个CDatacȝ指针来指向其数据?br>CData *m_pData;

CLargeObject臛_有两个构?a class="channel_keylink">函数。第一个是标准的构?a class="channel_keylink">函数Q初始化其数据。这时数据是唯一的,所以必L生成一个CData的object来存储数据?br>CLargeObject::CLargeObject(int nVal)
{
    m_pData = new Data(nVal);
}
而对于CDatacȝ构?a class="channel_keylink">函数而言Q初始化他的CLargeObject是第一个指向他的,q一时刻索引数目m_nReferenceCount??br>CLargeObject::Data::Data(int nVal) : m_nVal(nVal), m_nReferenceCount(1) {}

CLargeObject的第二个构?a class="channel_keylink">函数是拷贝构?copy constructor)。这L成的object不需要有新的数据Q和已有的object׃n数据可以了。这是烦引数目需要加1。表C又有一个object指向当前的CData了?br>CLargeObject::CLargeObject(const CLargeObject &ob) // copy constructor
{
    ob.m_pData->m_nReferenceCount++;
    m_pData = ob.m_pData;
}


q样CLargeObject构造好了,使用了可能的最的内存。下面看看他的析?a class="channel_keylink">函数(destructor)。当一个object被delete的时候,它的数据不一定无效,如果别的objectq在引用着q个数据Q数据需要留下来。当Ӟ数据的烦引数目无论如何都要减1?br>CLargeObject::~CLargeObject()
{
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
}

下面看一看赋值操作。先说用已有的CLargeObject赋值给q个CLargeObject。这时当前CLargeObject里面的数据要指向已有的这个objectQ就搞定了?br>CLargeObject& CLargeObject::operator = (const CLargeObject& ob)    // copy assignment
{
    ob.m_pData->m_nReferenceCount++;
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
    m_pData = ob.m_pData;

    return *this;
}

再来看看如何对CLargeObject里面的数据进行真正的修改。这样就一定需要对当前的object独立操作了,否则媄响到了其它指向同一块数据的CLargeObject。这样CDatac需要一个新?a class="channel_keylink">函数Q生成只用于当前CLargetObject的数据。如果当前的引用数目?Q那么当然这个CData是只用于这个CLargeObject的了。否则就重新new一个CDataq回?br>        Data* CLargeObject::CData::get_own_copy()    // clone if necessary
        {
            if (m_nReferenceCount==1)
                return this;
            m_nReferenceCount--;
            return new Data(m_nVal);
        }
CLargeObject修改前用q个函数得到唯一的objectQ然后对它赋倹{?br>void CLargeObject::SetVal(int nNewVal)
{
    m_pData = m_pData->get_own_copy();
    m_pData->m_nVal = nNewVal;
}
对于所有可能改变CData值的操作Q都需要用q种Ҏ?br>
下面是只?a class="channel_keylink">函数Q简单。直接返回|什么特D的都不用作?br>int CLargeObject::GetVal() const
{
    return m_pData->m_nVal;
}


q样copy-to-write技术就实现了。下面把完整的程序写一下:
class CLargeObject
{
public:
    CLargeObject(int nVal);
    CLargeObject(const CLargeObject &ob);
    ~CLargeObject();

    CLargeObject& operator = (const CLargeObject& ob);
    void SetVal(int nNewVal);
    int GetVal() const;
private:
    struct Data
    {
    public:
        Data(int nVal) : m_nVal(nVal), m_nReferenceCount(1) {}
    private:
        friend class CLargeObject;
        Data* get_own_copy()    // clone if necessary
        {
            if (m_nReferenceCount==1)
                return this;
            m_nReferenceCount--;
            return new Data(m_nVal);
        }

        // control variables.
        int m_nReferenceCount;
    
        // actual data portion
        int m_nVal;
    };

    Data *m_pData;
};

CLargeObject::CLargeObject(int nVal)
{
    m_pData = new Data(nVal);
}

CLargeObject::CLargeObject(const CLargeObject &ob) // copy constructor
{
    ob.m_pData->m_nReferenceCount++;
    m_pData = ob.m_pData;
}

CLargeObject::~CLargeObject()
{
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
}

CLargeObject& CLargeObject::operator = (const CLargeObject& ob)    // copy assignment
{
    ob.m_pData->m_nReferenceCount++;
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
    m_pData = ob.m_pData;

    return *this;
}

void CLargeObject::SetVal(int nNewVal)
{
    m_pData = m_pData->get_own_copy();
    m_pData->m_nVal = nNewVal;
}

int CLargeObject::GetVal() const
{
    return m_pData->m_nVal;
}


很多存储数据的系lclassQ如stringQCString{都有这U设计。所以记住这个应用是很有必要的?/p>

(Leyn)主 2008-11-09 20:37 发表评论
]]>
[转]利用Rational Roseq行C++代码和数据库l构分析http://www.shnenglu.com/yearner/archive/2008/10/28/65350.html(Leyn)主(Leyn)主Tue, 28 Oct 2008 09:36:00 GMThttp://www.shnenglu.com/yearner/archive/2008/10/28/65350.htmlhttp://www.shnenglu.com/yearner/comments/65350.htmlhttp://www.shnenglu.com/yearner/archive/2008/10/28/65350.html#Feedback1http://www.shnenglu.com/yearner/comments/commentRss/65350.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/65350.html 利用Rational Roseq行C++代码和数据库l构分析
?震杰, IBM 中国软g开发中心Y件工E师

本文内容包括:
 一QRational Rose逆向工程介绍
 二.如何用Rational Roseq行C++代码分析
 三.如何用Rational Roseq行数据库结构分?/font>
 四.如何得到逆向工程的模型图
 五.ȝ
 注释

 Rational Rose是利用UMLQ统一建模语言Q进行分析和设计面向对象软gpȝ的强大的可视化工P可以q行目需求分析、结构规划和生成框架代码Q还可以支持从现有系l逆向转出工程代码Q生成Rose模型的功能?br>2004q?0月,IBM推出了支持最新的UML2.0的可视化建模工具 Rational Software ArchitectQ见注释①) 和IBM Rational Software ModelerQ见注释②)。虽然它们支持在建模功能上有了更好的改进、支持了更新的标准,但是RSA的精彩功能主要是集中在对Java应用的支持,而IBM Rational Software Modeler则是主要xpȝ的模型设计,如果要从l构上分析C++~写的系l的代码QRational Roseq是首选的工具?/p>

接下来的文章会对如何利用Rational Rose 的逆向转出工程来进行系l分析进行更加详l地阐述?/p>

一QRational Rose逆向工程介绍

逆向工程QReverse EngineerQ就是从现有pȝ的代码来生成模型的功能。分析已有的代码其主要的目的是了解代码l构和数据结构,q些对应到模型图是cd、数据模型图和组件图Q对UML各种模型囄描述见注释③Q,也就是通过Rational Rose的逆向工程所得到的结果。Rational Rose所支持的逆向工程功能很强大,包括的编E语a有C++, VB, VC, Java, CORBAQ以及数据库DDL脚本{等Qƈ且可以直接连接DB2, SQLServer, Oracle和Sybase{数据库导入Schemaq生成数据模型?/p>

很多大型的C++开发的产品都涉及到数据库的使用Q对q种大型pȝ的开发,其是做二次开发的情况下,主要的难点就是对源码和数据库l构的分析。而利用Rose的逆向工程q一功能Q就可以完成代码'cd以及数据库Schema->数据模型囄转换Q解册两大隄Q可以开发和设计人员在对q种大型pȝ的升U、分析和开发中Q更为方ѝ快捗有条理地掌握系l结构,不用再ؓ分析庞大的系l结构而头疹{?/p>

二.如何用Rational Roseq行C++代码分析

q一节主要介l用户如何用Rose的逆向工程生成UML模型Qƈ用来q行C++代码的结构分析?/p>

Rational Rose可以支持标准C++和Visual C++的模型到代码的{换以及逆向工程。下面将详细地说明这两种C++ project的逆向工程的步骤和具体操作?/p>

1Q?ANSI C++Q标准C++Q逆向工程QReverse EngineerQ用标准C++逆向工程Q需要在lg图(component viewQ中创徏一个组ӞcomponentQ,讄好需要进行{换的lg的信息,也就是该lg的语a、所包含的文件、文件所在的路径、文件后~{等信息Q然后Reverse Engineer可以根据给定的信息代码{换成cd了?/p>

a) 右键点击lg视图QComponent ViewQ,选择New->ComponentQ创Z个新的组?br> 

 b) component的language属性设定ؓANSI C++

①选中创徏的componentQ点d键,选中Open Specification
 

②在q个对话框中该component的language讑֮为ANSI C++


c) 配置该ANSI C++ componentQ设|好该component中包含的C++代码文gQƈq行C++语言的详l设|?/p>

①选中该componentQ点d键,选择ANSI C++->Open ANSI C++ Specification


②把Source file root directory讑֮Z的C++源码文g所在的路径Qƈ且将需要{换的文gd到Project Files中,视你的需要来做其它的讑֮Q比如:头文件扩展名{等?/p>

d) 设|好的component转换成模型图

①选中讄好的componentQ点d键,选中ANSI C++->Reverse Engineer



 ②选中需要{换的classQ点击okQ一个component的逆向转换完成了?/p>



 2Q?Visual C++ 在用这个功能的时候,要求用户的机器上同时安装Visual Studio。Visual C++的逆向工程也需要首先创Z个componentQƈ该component的language属性设|ؓVC++。Rational Rose对VC++模型的{换是通过dVC++ Project File的信息来实现的,用户只需要将对应的project file信息指定lcomponent可以了?/p>

a) VC++ Project的信息赋l刚刚创建好的component?/p>

①选择该componentQ点d键,选择Assign To Project


②在对话框中扑ֈ刚刚创徏的componentQ右键点dƈ选择Properties?/p>


③在下面对话框中选中需要进行{换的ProjectQ点击okQ该component׃需要{换的project兌上了?/p>



 b) 设|好的component转换成模型图

选中讄好的componentQ点d键,Update Model…Q将会弹出确认对话框Q选中需要{换的classQ点击finish可以了?/p>


三.如何用Rational Roseq行数据库结构分?/strong>

利用Rational Rose可以q行关系数据库的数据模型设计q导出DDL语言脚本Q相反还可以导入已有的DDL脚本生成数据模型以及q接SQLServer, DB2, Oracle{数据库q导入数据库的schema生成数据模型?/p>

下面以SQL ServerZ说明一下逆向转换工程的步骤?/p>

a) 首先Q选择Tools->Data Modeler-> Reverse Engineer


 
 b) 在进行逆向工程转换的过E中可以选择是从数据库还是DDL脚本q行转换Q如果是DDL脚本转换Q就直接l定DDL脚本文g位置可以了。本例子l出的是q接SQLServer数据库将schema导入生成数据模型的过E,所以选中DatabaseQ进入下一步?/p>



 c) 填写数据库相关信?/p>



 d) 选中所有需要{换的schema



 e) 选择需要将哪些数据库中的元素导入到数据模型?br>

转换操作会自动在lg图(Component ViewQ中d数据库组Ӟq在逻辑图(Logical ViewQ中生成以《Schema》作为命名开头的数据模型?/p>



 打开数据模型Q可以看C数据库中转换q来的各个表和视图?/p>



 从数据模型图中可以看到表的结构以及各个表和视图之间的逻辑关系?/p>

四.如何得到逆向工程的模型图

在Rational Rose中,有些模型图是不会自动生成的,很多时候这个工作需要用h工来完成。也是_Rational Rose只负责生成模型,包括模型中的元素、元素的属性以及各个元素之间的关系Q但是需要用户做一些额外的工作来得到视图?/p>

首先Q通过逆向工程Q用户已l得CUML模型或者数据模型的各个lg以及它们之间的关pR?下一步需要在该模型上创徏一个视图,它们可以是类图(class diagramQ描q系l的静态结构)或者数据模型图QData model digramQ描q关pL据结构)。然后,手动从左边的explorer中将各个元素拖进视图中,在这个过E中Q各个元素之间的兌关系会自动在图中表示出来Q而不需要用户再做其他工作?/p>

例如Q生成一个数据模型的数据模型囄q程

从左边将数据模型中的数据元素拖到双的数据模型图中,表CustomerCustomerDemo和表CustomerDemographics之间的依赖关pȝ菱Ş头是自动生成的Q无需手工操作?/p>


一般来_一个系l中所涉及的数据元素非常多Q导致视囑־拥挤Q排版也非常困难。Rational Rose提供的自动排版功能可以很方便地帮助用戯册个问题?/p>

选择Format->Layout DiagramQ系l会图中的所有元素用最优方式重新排列,l用户一个清晰的视图?/p>



 五.ȝ

了解了Rational Rose的逆向工程功能Q用户就可以方便地利用这一工具q行大型数据库相关的C++pȝ的分析和研究了?/p>

注释

①IBM Rational Software Architect是一个集成式设计和开发工P使用户可以用UML模型驱动的开发方式开发出l构清晰的应用程序和服务?/p>

②IBM Rational Software Modeler是基于UML2.0的可定制的可视化建模和设计工P遵@它所提供的工作流E,可以使得pȝ设计师,pȝ分析师,设计人员{写出更为清晰的文档Q更为有效地q行沟通和设计工作?/p>

③UML提供的各U类型的模型描述?/p>

用例?Use Case Diagram)Q描q系l提供的一个功能单元,主要目的是帮助开发团队以一U可视化的方式理解系l的功能需求,包括Z基本程?角色"QactorsQ也是与系l交互的其他实体Q关p,以及pȝ内用例之间的关系?/p>

序列?Sequence Diagram)Q显C具体用例(或者是用例的一部分Q的详细程?/p>

状态图(Statechart Diagram)Q表C某个类所处的不同状态和该类的状态{换信息?/p>

zd?Activity Diagram)Q表C在处理某个zdӞ两个或者更多类对象之间的过E控制流?/p>

cd(Class Diagram)Q表CZ同的实体Qh、事物和数据Q如何彼此相养I换句话说Q它昄了系l的静态结构?/p>

lg?Component Diagram)Q提供系l的物理视图。组ӞComponentQ表C模型代码库、执行库和其它组件的信息。组件是代码的实际模块,lg图主要用h负责控制代码和编译部|应用程序的人。有些组件是代码库,有些lg是运行组Ӟ如执行文件或动态链接库QDLLQ文件。)

部v?Deployment View)Q表C软gpȝ如何部v到硬件环境中?/p>

数据模型?Data Model Diagram)Q描q关pL据结构?/p>



(Leyn)主 2008-10-28 17:36 发表评论
]]>
COM 学习W记(2)-引用计数http://www.shnenglu.com/yearner/archive/2008/10/08/63500.html(Leyn)主(Leyn)主Wed, 08 Oct 2008 13:57:00 GMThttp://www.shnenglu.com/yearner/archive/2008/10/08/63500.htmlhttp://www.shnenglu.com/yearner/comments/63500.htmlhttp://www.shnenglu.com/yearner/archive/2008/10/08/63500.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/63500.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/63500.html COM接口采用引用计数来控制组件的生命周期?br> 主要用AddRef ,Release 来进行内存管理,当客户从lg中取得一个接口时Q此引用计数值将?。当客户使用完某个接口后Q组件的引用计数值将??br> 当引用计数gؓ0Ӟlg卛_自׃内从中删除?br> 
 (1)正确使用引用计数的三条简单原?
   1)在返回之前调用AddRef.
   2)使用完接口后调用Release.
   3)在赋g后调用AddRef(指针复制).
  基本原则是避免在使用lgӞlg已被删除?br>  QueryInterface 和CreateInstance中已l调用了AddRef,因此不必再调用它?br>  但两者返回的IUnknow接口和一般接口,用完后都需要调用Release来释放?br>  一般而言Q每当复制一个接口的指针Ӟ都应该相应的增加引用计数?br>   IUnknown* pIUnknown=CreateInstance();
   IX * pIX=NULL;
   HRESULT hr= pIUnknown->QueryInterface(IID_IX,(void **)&pIX);
   pIUnknown->Release();
   if(SUCCEEDED(hr))
   {
    pIX->Fx();    //Fx()为功能函?br>    IX * pIX2=pIX;   //复制指针Q即增加了一个用组?的接?的可能,
    pIX2->AddRef();  //所以要增加计数Qƈ在用完之后release
    pIX2->Fx();     
    pIX2->Release(); //
    pIX->Release(); 
   }
   //上面代码中,作ؓ复制指针pIX2Q其生存周期与pIX相同Q即Q在pIX Release之前pIX2已l不再用了Q?br>   pIX保证了组件用安全的前提下,pIX不用AddRef和Release是肯定没问题的?br>   
   但有时很隑ֈ断某些没有加上AddRef和Release的调用是不是正确Q是优化q是E序错误。一般用来封?br>   引用计数Q从而解册个问题?指针)
   
   lg可以对其每一个接口分别维护一个引用计敎ͼ也可以对整个lgl护单个的引用计数。原则上选择了ؓ每一?br>   接口单独l护一个引用计数而不是针Ҏ个维护计敎ͼ原因Q一QɽE序调试更方便,二,支持pȝ资源的按需获取?br>   
 (2)AddRef\Release 实现
   主要是改变成员变量m_cRef的数倹{AddRef增加其数|Release减小数|q在此gؓ0时将lg删除?br>   单实玎ͼ
    ULONG _stdcall AddRef()
    {
     return ++m_cRef;//return InterlockIncrement(&m_cRef);
    }
    ULONG _stdcall Release()
    {
     if(--m_cRef==0)//if(InterlockDecrement(&m_cRef)==0)
     {
      delete this;
      return 0;
     }
     return m_cRef;
    }
   一般用InterlockIncrement和InterlockDecrement来实现AddRef\Release; 可以保同一旉只有同一U程来访问成员变量?br>  3)引用计数的优化原?br>    像(1)中例子,pIX能保障在pIX2生命周期内,lg肯定会在内存内存留。即Q那些生命周期嵌套在引用同一接口的指针的生命周期之内Ӟ外层的已有引用计敎ͼ内层的就可以不要了?br>    注意那些生命周期重叠的指针?br>    (1)输出参数原则
      如果接口指针以函数返回值或者以传出参数传出Q那么在函数内部Q返回参数前调用AddRef.
      ?QueryInterface/CreateInstance;
    (2)输入参数原则
      若接口指针作为参C递给一个函敎ͼ该函C修改也将其返回调用者,此时无需调用AddRef\Release例:
       void foo(pIX *pIX)
       {
        pIX->Fx();
       }
       因ؓ函数的生命周期嵌套在调用者的生命周期之内的?br>    (3)输入输出参数原则
      对于传递进来的接口指针Q必dl他附另外一个接口指针之前调用releaseQ返回之前,q必d输出参数指向的新接口调用AddRef;
  4)局部变量原?br>    它们是在函数的生存周期内才存在,因此不需要调用AddRef\Release
  5)全局变量原则
    在传递给另一个函C前,必须调用AddRef.
  6)不确定的情况
    此时需要调用AddRef\Release 以防万一


(Leyn)主 2008-10-08 21:57 发表评论
]]>
《C++高效~程》学习笔讎ͼ1Q?/title><link>http://www.shnenglu.com/yearner/archive/2008/10/01/63125.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Wed, 01 Oct 2008 06:53:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2008/10/01/63125.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/63125.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2008/10/01/63125.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/63125.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/63125.html</trackback:ping><description><![CDATA[1.量用const 和inline 而不?define<br>  1)例:#define ASPECT_RATIO 1.653<br>   在源码进入编译器之前Q预~译指o会被处理器去掉,直接?.653代替ASPECT_RATIOQ如果涉及到q个帔R的代码出错,若想?.653q踪到原指o会很困难<br>   所以,q种情况下一般用const double ASPECT_RATIO=1.653代替?br>   定义指针Ӟ需要把指针和指向的变量都定义成const<br>   const char * const authorName ="YLang"   <br>   <br>  2)有些~译器,cd只允许初始化整数cdQint,bool,charQ还只能是常?br>   若在cd分开声明数组和数l大,为避免某些编译器的不I采用enum枚D的方?br>   enum{NUM_TURNS=5};//直接采用 const NUM_TURNS=5; 对于某些止此行为的~译器来_会出现编译错误;<br>   int scores[NUM_TURNS];<br>  <br>  3)#define 宏的用法<br>   例:最大值算?br>     #define  max(a,b) ((a)>(b)?(a):(b))//每个参数必须加括?br>     在遇到自加时Q表C很大的不E_性?br>     int a=5,b=0;<br>     max(++a,b);//a的值增加了2?br>     max(++a,b+10);//a的值只增加??br>   采用inline函数来替换该宏?nbsp;  <br>   inline int max(int a,int b) {return a>b?a:b;}<br>   template<class T><br>   inline const T& max(const T& a, const T& b)<br>   { return a>b?a:b;}<br>   <br>2.量?lt;iostream>而不?lt;stdio.h><br>   scanf/printf 不是安全cdQ没有扩展性,q且把要d的变量和控制d格式信息分开?br>   重蝲q算W?lt;< 弥补了他们的~点?br>   <iostream>可移植性可扩展性较高,库类有构造函敎ͼ<stdio.h>库类没有构造函?br>   #include <iostream> ?include <iostream.h>的区?br>   前者得到的是置于std名字I间下的元素Q后者是同样的元素,但是全局I间里,会造成命名冲突?br>   <br>3.量用new和delete而不是malloc 和free<br> 前者会创徏/删除对象Q同时调用构?析构函数Q后者仅创徏/删除I间Q没有调用构?析构函数Q?br> <br>4.C++注释风格<br> 量不要?* */<br> <br>5.new和delete要对应相同的形式<br> new数组用了[] Qdelete也必ȝ[];<br> 如果要删除指针指向的数组I间需要用delete[];<br> <br>6.量在析构函数里Ҏ针成员调用delete<br> 除非cL员最初用了newQ否则是不用在析构里用delete的?br> 或者用指针来代?C++标准库auto_ptr)\<br> <br>7.预先准备好内存不的情况<br> 考虑到当new一个对象时Q理Z可能会发生无法完成内存分配而抛出异常的情况?br> C的做法是定义宏来分配内存q检查分配是否成功?br> q种宏的C++再现Q?br> #define NEW(PTR,TYPE)<br> try {(PTR)= new TYPE;}<br>  catch(std::bad_alloc&){assert(0);}<br> //说明Q?br> //1)assert查传l它的表辑ּ是否为非Ӟ如果不是?Q发Z条错误信息ƈ调用abort. <br> // 而assert只是在调试状?没有定义 NDEBUGE)下才会v作用Q品发布时(定义 NDEBUGE)assert什么都不做?<br> //2)没有考虑到new的多UŞ? new T;new T(constructor argument);new T[size];<br> 所以一般不用这U方?br> 单的ҎQ制定一错误处理函数Q在抛出异常前调用?br> 在头文g<new>?<br> typedef void (* new_handler)();<br> new_handler set_new_handler()(new_handler p) throw();<br> 在调用new之前Q用set_new_handler来设定错误处理函敎ͼ传入参数为函数指针?br> 例:<br>  void onMemoryError(){......}//invoke before throwing the expection;<br>  int mail()<br>  {<br>   set_new_handler(onMemoryError);<br>   int *pBigMemory=new int[100000];<br>  }<br> C++ 中处理机Ӟ<br>  讑֮处理函数为全局Q在set_new_handler安装自定义处理函C前保存原有函数?br>  分配内存Q若p|则抛出异常,q回之前恢复原处理函数?br>  void * X::operator new(size_t size)<br>  {<br>   new_handler globalHandler = // 安装X 的new_handler<br>   std::set_new_handler(currentHandler);<br>    <br>   void *memory;<br>    <br>   try<br>     { // 试分配内存<br>     memory = ::operator new(size);<br>     }<br>   catch (std::bad_alloc&)<br>     {<br>     // 恢复旧的new_handler<br>     std::set_new_handler(globalHandler);<br>     throw; // 抛出异常<br>     }<br>   std::set_new_handler(globalHandler); // 恢复旧的new_handler<br>   return memory;<br>  }<br><br><img src ="http://www.shnenglu.com/yearner/aggbug/63125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2008-10-01 14:53 <a href="http://www.shnenglu.com/yearner/archive/2008/10/01/63125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM 学习W记Q?Q?/title><link>http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Tue, 22 Jul 2008 10:50:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/56882.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/56882.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/56882.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span lang="EN-US">COM </span><span style="font-family: 宋体;">学习W记</span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">函数</span></p> <p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">主要用于</span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口的查询。它?/span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口定义</span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的成员函敎ͼ客户可以调用</span><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">来决定组件是否支持某个特定的接口?/span></p> <p class="MsoNormal"><span lang="EN-US"><span>       </span></span><span style="font-family: 宋体;">lg</span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口都是?/span><span lang="EN-US">IUnkonwn</span><span style="font-family: 宋体;">接口l承而来QQ何一个接口都可以?/span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的成?/span><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">来获取它所支持的其它接口?/span></p> <p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">1</span><span style="font-family: 宋体;">Q定义:</span></p> <p class="MsoNormal"><span lang="EN-US"><span>       </span>HRESULT _stdcall QueryInterface(const IID& iid,void ** ppv);</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">W一个参数十所需接口的标识,是一个接口标识符</span><span lang="EN-US">IID</span><span style="font-family: 宋体;">l构?/span> <span style="font-family: 宋体;">W二个参数存放所h接口指针的地址?/span></p> <p class="MsoNormal"><span lang="EN-US"><span> </span><span>     </span>2</span><span style="font-family: 宋体;">Q用过E:</span></p> <p class="MsoNormal"><span lang="EN-US"><span>       </span></span><span style="font-family: 宋体;">假定已有一个指?/span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的指?/span><span lang="EN-US">pI</span><span style="font-family: 宋体;">Qؓ知道相应的组件是否支持某个特定的接口Q调?/span><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">Q传l它一个接口标识符。若成功q回Q那是可以使用它返回的指针?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Void foo(IUnknown * pI)</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>IX *pIX=NULL;</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">HRESULT hr=pI->QueryInterface(IID_IX,(void **)&pIX);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">If(SUCCEEDED(hr))</span></p> <p class="MsoNormal" style="margin-left: 41.25pt; text-indent: 21.75pt;"><span lang="EN-US">pIX->Fx();</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">该函数用于查?/span><span lang="EN-US">pI</span><span style="font-family: 宋体;">是否支持?/span><span lang="EN-US">IID_IX</span><span style="font-family: 宋体;">所标识的接口?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的承不是虚拟基cR?/span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口不能按照虚拟方式l承它?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">3</span><span style="font-family: 宋体;">Q实玎ͼ</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Interface IX</span><span style="font-family: 宋体;">Q?/span><span lang="EN-US">IUnknown{/**/}</span><span style="font-family: 宋体;">Q?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Interface IY</span><span style="font-family: 宋体;">Q?/span><span lang="EN-US">IUnknown{/**/}</span><span style="font-family: 宋体;">Q?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Class CA</span><span style="font-family: 宋体;">Q?/span><span lang="EN-US">public IX,public IY{/**/};</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">主要通过判断标识W是否ؓ</span><span lang="EN-US">CA</span><span style="font-family: 宋体;">的支持类型,来判断是否ؓ存在?/span><span lang="EN-US">CA</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">COM</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">HRESULT _stdcall CA:;QueryInterface(const IID &iid,void **ppv)</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>If(iid==IID_IUnknown)</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=static_cast<IX *>(this);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Else if(iid==IID_IX)</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=static_cast<IX*>(this);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Else if (iid==IID_IY)</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=static_cast<IY*>(this);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Else </span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=NULL;</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Return E_NOINTERFACE;</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Static_cast<IUnknown*>(*ppv)->AddRef();</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Return S_OK;</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">4</span><span style="font-family: 宋体;">Q关于其中的cd转换</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US"><span>   </span></span><span style="font-family: 宋体;">E序中若?/span><span lang="EN-US">this</span><span style="font-family: 宋体;">指针直接转换?/span><span lang="EN-US">IUnknown*</span><span style="font-family: 宋体;">是不明确的。因为存在两个基cL口,需要指明是转换向哪一个接口的</span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Static_cast<IUnknown*> (static_cast<IX *>(this))</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-size: 10.5pt; font-family: "times new roman","serif";" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:414.75pt; height:235.5pt'"> <v:imagedata src="file:///C:\DOCUME~1\LEYANG~1.ETH\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><img src="file:///C:/DOCUME~1/LEYANG~1.ETH/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.jpg" v:shapes="_x0000_i1025" height="314" width="553"><!--[endif]--></span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">在类型{换时Q?/span><span lang="EN-US">CA</span><span style="font-family: 宋体;">按照序存放它的基类接口及其实现Q其</span><span lang="EN-US">this</span><span style="font-family: 宋体;">指针可以?/span><span lang="EN-US">IX</span><span style="font-family: 宋体;">代替Q地址值相同)?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">?/span><span lang="EN-US">IY</span><span style="font-family: 宋体;">则需?/span><span lang="EN-US">CA</span><span style="font-family: 宋体;">的基址加上偏移址?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p><img src ="http://www.shnenglu.com/yearner/aggbug/56882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2008-07-22 18:50 <a href="http://www.shnenglu.com/yearner/archive/2008/07/22/56882.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.fouming.cn" target="_blank">˾þþƷ</a>| <a href="http://www.satyw.cn" target="_blank">þ93Ʒ91þۺ</a>| <a href="http://www.enepower.cn" target="_blank">99þùѸ</a>| <a href="http://www.6t0n.cn" target="_blank">ҹƷþþþþþ</a>| <a href="http://www.glhv.cn" target="_blank">þۺϾþԾ99ëƬ</a>| <a href="http://www.caribbeanlagoon.com.cn" target="_blank">99þþƷѿһ </a>| <a href="http://www.huiju58.cn" target="_blank">91þó</a>| <a href="http://www.xp5hb9.cn" target="_blank">97þþƷˬ</a>| <a href="http://www.ampv.cn" target="_blank">þ97þ97Ʒӿϼ</a>| <a href="http://www.6qg.com.cn" target="_blank">Ʒһþþþþþվ</a>| <a href="http://www.hljfucai.cn" target="_blank">þþŷղa</a>| <a href="http://www.xoci.cn" target="_blank">޹Ʒһþhs</a>| <a href="http://www.cqxy168.cn" target="_blank">˾þþƷһ</a>| <a href="http://www.antsgogo.cn" target="_blank">͵ٸþþþþþþ</a>| <a href="http://www.cn0513.cn" target="_blank">þ޾Ʒa</a>| <a href="http://www.shiyoulhg.cn" target="_blank">Ů˸߳þþýˮ</a>| <a href="http://www.gb9948-2013.cn" target="_blank">þþֻоƷձ</a>| <a href="http://www.93jk.cn" target="_blank">ۺŮþþ30p</a>| <a href="http://www.xysrsks.cn" target="_blank">þþwww</a>| <a href="http://www.hotfan.cn" target="_blank">þ91Ʒ91þ鶹</a>| <a href="http://www.h2ofood.cn" target="_blank">91ƷۺϾþĻþһ </a>| <a href="http://www.fengjinl.cn" target="_blank">޹þþþƷ</a>| <a href="http://www.cadcamcae.com.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.9lang.cn" target="_blank">þseƷһ</a>| <a href="http://www.vueq.cn" target="_blank">뾫Ʒþһ</a>| <a href="http://www.xoci.cn" target="_blank">þù޾Ʒ</a>| <a href="http://www.gsm1.com.cn" target="_blank">99þɫĻ</a>| <a href="http://www.yidasoft.com.cn" target="_blank">պþӰԺ</a>| <a href="http://www.818jk.cn" target="_blank">þþAVҰ</a>| <a href="http://www.wsjpt.cn" target="_blank">ݺɫݺݺݺݺɫۺϾþ</a>| <a href="http://www.yylsax.cn" target="_blank">91ƷۺϾþĻþһ</a>| <a href="http://www.shiyana.cn" target="_blank">þһ99</a>| <a href="http://www.sj0524.cn" target="_blank">AVպAVþ</a>| <a href="http://www.bitpter.cn" target="_blank">99Ʒþþþþþ</a>| <a href="http://www.m-xc.cn" target="_blank">AvƷþ</a>| <a href="http://www.sai-shang.cn" target="_blank">޾ƷþþþþðĦ</a>| <a href="http://www.yyyart.cn" target="_blank">Ʒþ߹ۿ</a>| <a href="http://www.diy800.cn" target="_blank">һþþƷһ</a>| <a href="http://www.jkmdz.cn" target="_blank">þ޹ŷ޾Ʒһ</a>| <a href="http://www.dgdike.cn" target="_blank">ƷۺϾþþþþ98</a>| <a href="http://www.cdge.cn" target="_blank">Ʒ˾þþþҹӰ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>