blob: c9cfaa16b04fdbb2915ea8ece2507bd6b9e6f02b [file] [log] [blame]
<HTML>
<HEAD>
<TITLE>A Simple Extractor and Inserter for the Example</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="32-2.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="32-4.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library User's Guide</B></DIV>
<H2>32.3 A Simple Extractor and Inserter for the Example</H2>
<P>Following the read and write conventions of iostreams, we would insert and extract the date object like this:</P>
<UL><PRE>
date birthday(2,6,1952);
std::cout &lt;&lt; birthday &lt;&lt; '\n';
</PRE></UL>
<P>or </P>
<UL><PRE>
date aDate;
std::cout &lt;&lt; '\n' &lt;&lt; "Please, enter a date (day month year)"
&lt;&lt; '\n';
std::cin &gt;&gt; aDate;
std::cout &lt;&lt; aDate &lt;&lt; '\n';
</PRE></UL>
<A NAME="idx781"><!></A>
<P>For the next step, we would implement shift operators as inserters and extractors for <SAMP>date</SAMP> objects. Here is an extractor for class <SAMP>date</SAMP>:</P>
<UL><PRE>
template&lt;class charT, class Traits&gt;
std::basic_istream&lt;charT, Traits&gt;&amp; //1
operator&gt;&gt; (std::basic_istream&lt;charT,Traits&gt;&amp; is, //2
date&amp; dat) //3
{
is &gt;&gt; dat.tm_date.tm_mday; //4
is &gt;&gt; dat.tm_date.tm_mon;
is &gt;&gt; dat.tm_date.tm_year;
return is; //5
}
</PRE></UL>
<TABLE CELLPADDING="3">
<TR VALIGN="top"><TD><SAMP>//1</SAMP></TD><TD>The returned value for extractors (and inserters) is a reference to the stream, so that several extractions can be done in one expression.
<TR VALIGN="top"><TD><SAMP>//2</SAMP></TD><TD>The first parameter usually is the stream from which the data shall be extracted.
<TR VALIGN="top"><TD><SAMP>//3</SAMP></TD><TD>The second parameter is a reference, or alternatively a pointer, to an object of the user-defined type.
<TR VALIGN="top"><TD><SAMP>//4</SAMP></TD><TD>In order to allow access to private data of the date class, the extractor must be declared as a friend function in class <SAMP>date</SAMP>.
<TR VALIGN="top"><TD><SAMP>//5</SAMP></TD><TD>The return value is the stream from which the data was extracted.
</TABLE>
<A NAME="idx782"><!></A>
<P>As the extractor accesses private data members of class date, it must be declared as a friend function to class date. The same holds for the inserter. Here's a more complete version of class <SAMP>date</SAMP>:</P>
<UL><PRE>
class date {
public:
date(int d, int m, int y);
date(tm t);
date();
// more constructors and useful member functions
private:
std::tm tm_date;
template&lt;class charT, Traits&gt;
friend std::basic_istream&lt;charT, Traits&gt;
&amp;operator &gt;&gt;(std::basic_istream&lt;charT, Traits &gt;&amp; is, date&amp; dat);
template&lt;class charT, Traits&gt;
friend std::basic_ostream&lt;charT, Traits&gt;
&amp;operator &lt;&lt;(std::basic_ostream&lt;charT, Traits &gt;&amp; os,
const date&amp; dat);
};
</PRE></UL>
<A NAME="idx783"><!></A>
<P>The inserter can be built analogously, as shown below. The only difference is that you would hand over a <I>constant</I> reference to a date object, because the inserter is not supposed to modify the object it prints.</P>
<UL><PRE>
template&lt;class charT, class Traits&gt;
std::basic_ostream&lt;charT, Traits&gt;&amp;
operator &lt;&lt; (std::basic_ostream&lt;charT, Traits &gt;&amp; os,
const date&amp; dat)
{
os &lt;&lt; dat.tm_date.tm_mon &lt;&lt; '-';
os &lt;&lt; dat.tm_date.tm_mday &lt;&lt; '-';
os &lt;&lt; dat.tm_date.tm_year ;
return os;
}
</PRE></UL>
<BR>
<HR>
<A HREF="32-2.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="32-4.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>
<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1775151-1";
urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->
</BODY>
</HTML>