最近开始做C++课程设计,我的题目是:编写一个字符串(String)类。
为了尽可能写得适用些,我决定重载 cout<< 和 cin>> 进行该类的输入输出。我查看了很多网站,都说了一种重载方式如下:
friend ostream& operator<<(ostream&,classname&);
friend istream& operator>>(istrema&,classname&);
程序具体如下:
class String
{
public:
String(){} //构造函数1
String(char *s); //构造函数2
~String(); //析构函数
String operator =(String s); //=号重载1
String operator =(char *s); //=号重载2
friend ostream& operator<<(ostream&,String &); //<<重载为友元
friend istream& operator>>(istream&,String &); //>>重载为友元
private:
char *str; //串首指针
int len; //串长度
}
//-----------函数实现-------------
String::String(char *s)
{
int k=0;
char *p;
for(p=s;*p!='\0';p++) // 求长度
k++;
len=k;
str=new char[len+1];
for(int i=0;i<len;i++)
str[i]=s[i];
str[len]='\0';
}
// '='号重载(1),将一个String类的对象赋值给另一个String类的对象
String String::operator =(String s)
{
str=new char[s.len+1];
strcpy(str,s.str);
str[s.len]='\0';
len=s.len;
return *this; //返回this指针所指向的对象
}
// '='号重载(2),将一个String类的对象用字符串常量初始化
String String::operator =(char *s)
{
int k=0;
char *p;
for(p=s;*p!='\0';p++)
k++;
len=k;
str=new char[len+1];
for(int i=0;i<len;i++)
str[i]=s[i];
str[len]='\0';
return *this;
}
ostream& operator <<(ostream& os,String &s) //插入运算符'<<'的重载
{
os<<s.str;
return os; //返回输出流对象
}
istream& operator >>(istream& is,String &s) //提取运算符'>>'的重载
{
int count;
getchar();
count = stdin->_cnt; //取得缓冲区的字符数量
s.str = new char[count+1]; //申请空间
memcpy(s.str, stdin->_base, count?count:1); //将字符串复制到新申请的空间中
*(s.str+count) = '\0'; //添加字符串结束标志
s.len=count;
return is; //返回输入流对象
}
void main()
{
String str;
cout<<"Input a string:"<<endl;
cin>>str;
cout<<str<<endl;
}
上面的程序
如果使用#include <iostream.h>包含头文件,则该方法可行;
但是如果使用命名空间(
即:#include <iostream>
using namespace std;
)
则编译会报如下两类错误:
(1).
error C2593: 'operator >>' is ambiguous
error C2593: 'operator <<' is ambiguous
(2).
上述两个友元函数中不能访问私有成员。
于是,我又查阅了大量网站,发现也有人碰到同样的问题,如:
http://community.csdn.net/Expert/topic/5617/5617014.xml?temp=.5877649
http://topic.csdn.net/t/20020822/09/960282.html
但众说纷纭,无所适从,没有最终确切的答案。还望忘各位指点!不甚感激!
上次可能说得不够具体,见很多朋友来看了,却没有答复,所以这次把程序帖出来,
希望能把问题说得更明白些。
[此贴子已经被作者于2007-7-1 11:33:37编辑过]