以下是逐字说明:
字符串插入/提取运算符(<<>>)需要在MyString对象中重载。这些运算符还需要能够进行级联运算(即,cout<<< String1<< String2或cin>> String1>> String2)。字符串插入运算符(>>)将读取整行字符,这些字符由行尾字符(\ n)或256个字符长终止。超过256个字符的输入行将仅限于前256个字符。
有了这个,这是我到目前为止得到的代码:
在我的.cpp文件中:
istream& MyString::operator>>(istream& input, MyString& rhs)
{
char* temp;
int size(256);
temp = new char[size];
input.get(temp,size);
rhs = MyString(temp);
delete [] temp;
return input;
}
在我的.h文件中:
istream的&安培;运算符>>(istream& input,MyString& rhs);
从main.cpp文件调用:
MyString String1;
const MyString ConstString("Target string"); //Test of alternate constructor
MyString SearchString; //Test of default constructor that should set "Hello World"
MyString TargetString (String1); //Test of copy constructor
cout << "Please enter two strings. ";
cout << "Each string needs to be shorter than 256 characters or terminated by
/.\n" << endl;
cout << "The first string will be searched to see whether it contains exactly the second string. " << endl;
cin >> SearchString >> TargetString; // Test of cascaded string-extraction operator<<
我得到的错误是:istream&amp; MyString :: operator&gt;&gt;(std :: istream&amp;,MyString&amp;)â必须只取一个参数
我该如何纠正?如果没有rhs和输入
,我对如何做到这一点非常困惑答案 0 :(得分:1)
您必须将operator>>
创建为非成员函数。
就像现在一样,你的函数需要三个参数:隐式调用对象,istream&
和MyString& rhs
。但是,由于operator>>
是二元运算符(它只需要两个参数),因此无效。
这样做的方法是使其成为非成员函数:
// prototype, OUTSIDE the class definition
istream& operator>>(istream&, MyString&);
// implementation
istream& operator>>(istream& lhs, MyString& rhs) {
// logic
return lhs;
}
这样做(非成员函数)就是你必须要做所有你希望你的班级在右侧的操作员,以及你不能在左侧修改的类。< / p>
另请注意,如果您希望该功能可以访问对象的private
或protected
成员,则必须在类定义中声明friend
。