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

📄 subject_65475.htm

📁 vc
💻 HTM
字号:
<p>
序号:65475 发表者:由零开始 发表日期:2003-12-17 21:03:41
<br>主题:请问这个友元函数为何不能访问私有成员???
<br>内容://mystring.h<BR><BR>#include &lt;iostream&gt;<BR>using namespace std;<BR><BR>class String;<BR>istream&amp; operator&gt;&gt;( istream &amp;, String &amp; );<BR>ostream&amp; operator&lt;&lt;( ostream &amp;, const String &amp; );<BR><BR>class String<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;friend bool operator==( const String &amp;, const String &amp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;friend bool operator==( const char *, const String &amp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;friend bool operator==( const String &amp;, const char * );<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;//构造和析构<BR>&nbsp;&nbsp;&nbsp;&nbsp;String( const char* = 0 );<BR>&nbsp;&nbsp;&nbsp;&nbsp;String( const String &amp; );<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;~String();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//赋值操作符的重载集合<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&amp; operator=( const String &amp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&amp; operator=( const char * );<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&amp; operator+=( const String &amp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&amp; operator+=( const char * );<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//重载的下标操作符<BR>&nbsp;&nbsp;&nbsp;&nbsp;char&amp; operator[]( int ) const;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//等于操作符的重载集合<BR>&nbsp;&nbsp;&nbsp;&nbsp;//str1 == str2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bool operator==( const char * ) const;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bool operator==( const String &amp; ) const;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//成员访问函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;int size() { return _size; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;char* c_str() { return _string; }<BR><BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;int _size;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *_string;<BR>};<BR><BR>///////////////////////////////////////////////////////////////////////////<BR>//string.cpp<BR><BR>#include &lt;iostream&gt;<BR>#include &#34;mystring.h&#34;<BR>using namespace std;<BR><BR>inline String&amp; String::operator += ( const String &amp;rhs )<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//如果rhs应用的String不为空<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( rhs._string )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String tmp( *this );<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建足够大的存储区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以便包含被连接之后的String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_size += rhs._size;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete [] _string;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_string = new char[ _size + 1 ];<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//首先,把原来的String拷贝到新的存储区中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//然后附加上rhs所指的String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( _string, tmp._string );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( _string + tmp._size, rhs._string );<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return *this;<BR>}<BR><BR>inline String&amp; String::operator += ( const char *s )<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//如果rhs应用的String不为空<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( s )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String tmp( *this );<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建足够大的存储区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以便包含被连接之后的String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_size += strlen( s );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete [] _string;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_string = new char[ _size + 1 ];<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//首先,把原来的String拷贝到新的存储区中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//然后附加上rhs所指的String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( _string, tmp._string );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( _string + tmp._size, s );<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return *this;<BR>}<BR><BR>bool String::operator==( const String &amp;rhs ) const<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( _size != rhs._size )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return strcmp( _string, rhs._string ) ? false : true;<BR>}<BR><BR><BR>/* 错误在这个函数里面!!!!!!*/<BR>bool operator==( const String&amp; str1, const String &amp;str2 )<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( str1._size != str2._size )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return strcmp( str1._string, str2._string ) ? false : true;<BR>}<BR><BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;String myStr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;myStr = &#34;Sherlock&#34;;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR><BR>编译提示:<BR><BR>Compiling...<BR>string.cpp<BR>F:\LJL\CPPPRIMER\string.cpp(60) : error C2248: '_size' : cannot access private member declared in class 'String'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:\ljl\cppprimer\mystring.h(39) : see declaration of '_size'<BR>F:\LJL\CPPPRIMER\string.cpp(60) : error C2248: '_size' : cannot access private member declared in class 'String'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:\ljl\cppprimer\mystring.h(39) : see declaration of '_size'<BR>F:\LJL\CPPPRIMER\string.cpp(63) : error C2248: '_string' : cannot access private member declared in class 'String'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:\ljl\cppprimer\mystring.h(40) : see declaration of '_string'<BR>F:\LJL\CPPPRIMER\string.cpp(63) : error C2248: '_string' : cannot access private member declared in class 'String'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:\ljl\cppprimer\mystring.h(40) : see declaration of '_string'<BR>Error executing cl.exe.<BR><BR>string.obj - 4 error(s), 0 warning(s)
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Cxt_ann 回复日期:2003-12-17 21:32:16
<br>内容:问题很多:首先,你使用了strcpy等函数,却没有包含#include &lt;cstring&gt;<BR>还有,既然你在类中声明了析构函数,不管他工作不工作,都要定义:<BR>String :: ~String()<BR>{}<BR>另外,你在类声明中声明了构造函数,为什么不定义,出错!<BR>2003-12-17 21:46:36

⌨️ 快捷键说明

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