0

以下是逐字说明:

字符串插入/提取运算符(<< 和 >>)需要在 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& 输入, 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& MyString::operator>>(std::istream&, MyString&)â 必须只接受一个参数

我该如何纠正?我对如何在没有 rhs 和输入的情况下做到这一点感到非常困惑

4

1 回答 1

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;
}

这样做(非成员函数)是您必须在您希望您的类位于右侧的所有运算符以及您无法在左侧修改的类的方式。

另请注意,如果您想拥有该函数访问权限private或对象成员,则必须在类定义protected中声明它。friend

于 2012-04-30T02:31:13.903 回答