重载级联插入运算符

时间:2012-04-30 02:24:07

标签: c++ string operator-overloading insertion

以下是逐字说明:

  

字符串插入/提取运算符(<<>>)需要在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和输入

,我对如何做到这一点非常困惑

1 个答案:

答案 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>

另请注意,如果您希望该功能可以访问对象的privateprotected成员,则必须在类定义中声明friend