⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_40099.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:40099 发表者:heavenkiller 发表日期:2003-05-15 17:55:41
<br>主题:关于Object基类重载操作符时出现的重大问题!!!
<br>内容:Object.h<BR><BR>#include &lt;iostream.h&gt;<BR>class Object<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;friend ostream&amp; operator &lt;&lt;(ostream&amp; , Object const&amp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>public:<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual int CompareTo (Object const&amp;) const = 0;<BR><BR>//<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~Object ();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual bool IsNull () const;<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual int Compare (Object const&amp;) const;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//virtual ostream&amp; operator &lt;&lt;(ostream&amp; , Object const&amp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;//virtual ostream&amp; operator &lt;&lt;(ostream&amp; );<BR><BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual void Put (ostream&amp;) const = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>//在重载时注意:<BR>//&nbsp;&nbsp;&nbsp;&nbsp;!=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// &lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//两个操作符加起来时<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&lt;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-11;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&gt;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//<BR>inline bool operator == ( Object const&amp; right)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ return (*this).Compare (right) == 1; }<BR><BR>inline bool operator != ( Object const&amp; right)<BR>&nbsp;&nbsp;&nbsp;&nbsp; { return (*this).Compare (right) == 0; }<BR><BR>inline bool operator &lt;= ( Object const&amp; right)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ return (*this).Compare (right) == -11; }<BR><BR>inline bool operator &lt;&nbsp;&nbsp;( Object const&amp; right)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ return (*this).Compare (right) == -10; }<BR><BR>inline bool operator &gt;= ( Object const&amp; right)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ return (*this).Compare (right) == 11; }<BR><BR>inline bool operator &gt;&nbsp;&nbsp;( Object const&amp; right)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ return (*this).Compare (right) == 10; }<BR><BR><BR><BR><BR>};<BR><BR><BR><BR>object.cpp<BR><BR><BR>#include "Object.h"<BR><BR>#include &lt;typeinfo&gt;<BR><BR>Object::~Object ()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{}<BR><BR>bool Object::IsNull () const<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ return false; }<BR><BR>int Object::Compare (Object const&amp; object) const<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (typeid (*this) == typeid (object))<BR>&nbsp;&nbsp;&nbsp;&nbsp;return CompareTo (object);<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (typeid (*this).before (typeid (object)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<BR>}<BR><BR><BR>ostream&amp; operator &lt;&lt;(ostream&amp; s,Object const &amp; object)<BR>&nbsp;&nbsp; { object.Put (s); return s; }<BR><BR>SomeObject.h<BR><BR>#include "Object.h"<BR>class SomeObject&nbsp;&nbsp;:public Object<BR>{<BR><BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;int i;<BR>public:<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;int CompareTo(Object const&amp;) const;<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;SomeObject(int=0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~SomeObject();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//pure virtual function<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Put(ostream &amp;) const;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>};<BR><BR>SomeObject.cpp<BR><BR>#include "SomeObject.h"<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// Construction/Destruction<BR>//////////////////////////////////////////////////////////////////////<BR><BR>SomeObject::SomeObject(int object)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;i=object;<BR>}<BR><BR>SomeObject::~SomeObject()<BR>{<BR><BR>}<BR><BR>void SomeObject::Put(ostream &amp; s)const<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;s&lt;&lt;i;<BR>}<BR><BR>int SomeObject::CompareTo(Object const&amp; some)const<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SomeObject const &amp; someobject=dynamic_cast&lt;SomeObject const &amp;&gt;(some)<BR>////////////////////////////////////////////////////////////////&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; if (i==(someobject.i)) ///***出错的地方<BR>///////////////////////////////////////////&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;1; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (i!=someobject.i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR><BR><BR>if (i&lt;=someobject.i)<BR>return -11;<BR><BR>if (i&lt;someobject.i)<BR>return -10;<BR>if (i&gt;=someobject.i)<BR>return 11;<BR>if (i&gt;someobject.i)<BR>return 10;<BR><BR>}<BR><BR><BR>debug.cpp<BR><BR>#include "SomeObject.h"<BR>#include "iostream.h"<BR><BR><BR>main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;char z;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int inta=10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char chara='a';<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;SomeObject a(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SomeObject b(2);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;a&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&lt;&lt;b&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"a.i"&lt;&lt;a.i&lt;&lt;endl;<BR>///////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (a==b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"the bigger is:"&lt;&lt;a;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else cout &lt;&lt;"the bigger is:"&lt;&lt;b;<BR>////////////////////////////////////////////<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt;z;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR>这是我编的一个Object基类,以及其子类SomeObject类,我重载了==,&lt;=等操作符,但是当我将<BR><BR><BR>///////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (a==b)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"the bigger is:"&lt;&lt;a;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else cout &lt;&lt;"the bigger is:"&lt;&lt;b;<BR>////////////////////////////////////////////<BR>代码加入到main()中的时候,调试出现错误,弹出异常。<BR>异常指示如上所示,在<BR>////////////////////////////////////////////////////////////////&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; if (i==(someobject.i)) ///***出错的地方<BR>///////////////////////////////////////////<BR>处,<BR>可是这里有什么错误?<BR>请指示一下!<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:heavenkiller 回复日期:2003-05-27 20:30:55
<br>内容:为什么没有人会?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:哎哟 回复日期:2003-05-29 08:01:40
<br>内容:1.你这段代码虽然写的很别扭,但是至少在你说出错的地方,应该是对的。你用的什么编译器?RTTI打开了吗?<BR>2.不要用iostream.h,用iostream<BR>3.你的代码就够非常混乱。<BR>4.friend ostream&amp; operator &lt;&lt;(ostream&amp; , Object const&amp; );这种实现方法不好。应该用member+func法,可以省去一个难看的friend。参见<BR>http://www.allaboutprogram.com/bb/viewtopic.php?t=25&amp;postdays=0&amp;postorder=asc&amp;start=0
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -