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

📄 o4.htm

📁 C++Builder教学大全
💻 HTM
字号:
 

<html>

<head>

<title>在C++Builder中,如何简化基本数据类型的流操作</title>

<meta http-equiv="目录类型" content="文本/html; 字符集=gb2312">

</head>

<body bgcolor="#FFFFFF">

<table width="100%" border="0" height="285">

  <tr> 

    <td height="35"> 

      <div align="center" class="p14"><font color="#000000">在 C++Builder  

        中,如何简化基本数据类型的流操作 ?</font></div> 

    </td> 

  </tr> 

  <tr valign="top">  

    <td>

      <p><font color=#000000>如何简化基本数据类型的流i/o操作? 即怎样将整数/浮点数/字符型等数据类型的流操作用同一种代码书写出来  

        ? </font> </p> 

      <hr noShade size=1 width="100%"> 

      <font color="#000000">

      描述:程序中可能需要将某个类的实例对象存入流中,而该类中可能包含有各种类型的对象, 如:整数/浮点数/字符型等,粗心大意的写法可能如下:<br> 

      void TSomeClass::SaveToStream(TStream *stream)<br> 

      {<br> 

      </font> 

      <dir><font color="#000000">stream-&gt;WriteBuffer(this,sizeof(*this));<br>

        </font>

      </dir>

      <font color="#000000">

      }<br>

      很明显,以上写法的弊端很多,如不能支持虚函数、类的版本识别及指针型的动态对象, 为此,我们通常会将该类中每个对象分别进行流操作,可提供更多的灵活性,  

      但这样书写的代码较长,显得很烦琐。比如:<br> 

      void TSomeClass::SaveToStream(TStream *stream)<br> 

      {<br> 

      </font> 

      <dir><font color="#000000">stream-&gt;WriteBuffer(&amp;count,sizeof(count));<br>

        stream-&gt;WriteBuffer(&amp;num,sizeof(num));<br>

        other-&gt;SaveToStream(stream);<br>

        //其它存储代码....<br>

        </font>

      </dir>

      <font color="#000000">

      }<br>

      既然如此,有没有办法可将以上代码作些简化呢?</font> 

      <p>  </p>

      <p><font color="#000000">实际上,这个问题就是怎样将整数/浮点数/字符型等数据类型的流操作用同一种代码书写出来 ? 很明显,都会想起使用类模板来构造类。一个通用的类构造如下:</font>  

      <p><font color="#000000">template &lt; class T &gt; class TDataIO<br> 

        {<br> 

      </font> 

      <dir><font color="#000000">private:<br>

        &nbsp;T d;<br> 

        public:<br> 

        &nbsp;TDataIO(T d){this-&gt;d=d;}<br> 

        &nbsp;TDataIO(void){ ; }<br> 

        protected:<br> 

        &nbsp;T SaveToStream(TStream*stream)<br> 

        &nbsp;{stream-&gt;WriteBuffer(&amp;d,sizeof(T));return d;}<br> 

        &nbsp;T LoadFromStream(TStream*stream)<br> 

        &nbsp;{stream-&gt;ReadBuffer(&amp;d,sizeof(T));return d;}<br> 

        public:<br> 

        &nbsp;T operator&gt;&gt;(TStream*stream)<br> 

        &nbsp;{return SaveToStream(stream);}<br> 

        &nbsp;T operator&lt;&lt;(TStream*stream)<br> 

        &nbsp;{return LoadFromStream(stream);}<br> 

        </font> 

      </dir> 

      <font color="#000000">

      };</font> 

      <p><font color="#000000">利用以上类,便可直接写出如下代码:<br>

      </font>

      <dir><font color="#000000">TDataIO&lt; int &gt; ( num ) &gt;&gt; stream; //将num作为int型存储<br> 

        TDataIO&lt; double &gt; ( sum ) &gt;&gt; stream; //将sum作为double型存储<br> 

        int n = TDataIO&lt; int &gt; ( ) &lt;&lt; stream; //从流中读取一个整数赋给n<br> 

        double d = TDataIO&lt; double &gt; ( ) &lt;&lt; stream; //从流中读取一个浮点数给d<br> 

        </font> 

      </dir> 

      <font color="#000000">

      当然,对常用的构造类还可作进一步具体化的,比如可定义以下具体流类:<br>

      </font>

      <dir><font color="#000000">typedef TDataIO &lt; char &gt; TChar;<br> 

        typedef TDataIO &lt; bool &gt; TBool;<br> 

        typedef TDataIO &lt; int &gt; TInt;<br> 

        typedef TDataIO &lt; double &gt; TDouble;<br> 

        </font> 

      </dir> 

      <font color="#000000">

      替换以上具体的类定义,流操作代码便可进一步简化书写:<br>

      </font>

      <dir><font color="#000000">TInt ( num ) &gt;&gt; stream; //将num作为int型存储<br> 

        TDouble ( sum ) &gt;&gt; stream; //将sum作为double型存储<br> 

        int n = TInt ( ) &lt;&lt; stream; //从流中读取一个整数赋给n<br> 

        double d = TDouble ( ) &lt;&lt; stream; //从流中读取一个浮点数给d<br> 

        </font> 

      </dir> 

      <hr noShade size=1 width="100%"> 

      <p><font color="#000000">很显然,以上类模板(TDataIO)还可以适应定长的构造类型(struct/class), 但构造类型中不能包含指针对象和虚函数,否则在读取操作之后,  

        相应对象的多态性和指针对象的存取将会导致意料不到的后果! 如果它已经在运行了,那可惨了! 赶紧选择(Run|Program Reset)命令吧。</font>  

      <p><font color="#000000">难道这个类模板的功能如此差劲,被这么个小问题都搞得死去活来 ? 还好,天无绝人之路,对于构造类型,可以使用以上类模板对指针对象分别进行处理,  

        同样能save/load构造类型中的指针对象,同时还可消除虚函数对流操作的影响, 此外,还可对流类的版本控制带来直接的益处,请参见“  

     <font color="#000000">流类的版本控制</font></a>”。  

     </font></td> 

  </tr> 

</table> 

<br> 

</body> 

</html> 

⌨️ 快捷键说明

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