2012-04-30 1 views
0

В данном разделе приведены инструкции стенографические: операторыперегрузкой каскадные вставки оператора

вставки строк/извлечения (< < и >>) должны быть перегружены в пределах объекта MyString. Эти операторы также должны быть способны к каскадным операциям (т. Е. Cout < < String1 < < Строка2 или 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 :: оператор >> (станд :: IStream &, MyString &) â должен принимать ровно один аргумент

Как это исправить? Я очень запутался в том, как это сделать без BOTH и их ввода

+0

Это «оператор извлечения потока». – chris

+0

На самом деле это оператор смены вправо, но потоки используют его как так называемый «оператор извлечения» –

+0

@SethCarnegie, правда, я сравнивал его с использованием «оператора вставки» – chris

ответ

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 в определении вашего класса.

+0

Возможно, это только я, но я все еще получая те же ошибки. – user1363061

+1

@ user1363061 если ваш вопрос не решен, вы не должны отмечать это как ответ. Вам придется создать тестовый сценарий, который мы можем скомпилировать и получить ту же ошибку. –

+0

Ha! Я понял! Спасибо огромное! Теперь я уверен, что могу сделать то же самое с оператором вставки – user1363061