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& operator>>(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&)â は正確に 1 つの引数を取る必要があります

どうすればこれを修正できますか? rhsと入力の両方なしでこれを行う方法について非常に混乱しています

4

1 に答える 1

1

operator>>非メンバー関数としてを作成する必要があります。

現在のように、関数は3つの引数を期待しています。暗黙の呼び出しオブジェクト、、、istream&およびMyString& rhsです。ただし、operator>>は二項演算子であるため(正確に2つの引数を取る)、これは機能しません。

これを行う方法は、非メンバー関数にすることです。

// 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 に答える