Вопрос о пользовательских операторах ввода / вывода в C ++? - PullRequest
0 голосов
/ 05 июля 2011

У меня есть следующий фрагмент кода:

 class Student {
 public:
     Student(){}
     void display() const{}
     friend istream& operator>>(istream& is, Student& s){return is;}
     friend ostream& operator<<(ostream& os, const Student& s){return os; }
 };
int main()
{
    Student st;
    cin >> st;
    cout << st;

    getch();
    return 0;
}

Я пробовал себя, опуская ключевые слова friend, чтобы операторы стали функцией-членом класса Student, тогда компилятор выдаст "binary 'operator >>' has too many parameters". Я читал документ, в котором говорилось, что это произошло потому, что все функции-члены всегда получают неявный параметр «this» (поэтому все функции-члены могут получать доступ к закрытым переменным). Исходя из этого объяснения, я попытался сделать следующее:

class Student {
 public:
     Student(){}
     void display() const{}
     istream& operator>>(istream& is){return is;}
     ostream& operator<<(ostream& os){return os; }
 };
int main()
{
    Student st;
    cin >> st;
    cout << st;

    getch();
    return 0;
}

И получил сообщение об ошибке: "error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'Student' (or there is no acceptable conversion)"

Может кто-нибудь дать мне четкое объяснение, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

Нельзя сказать, что функция является функцией друга, а затем включить функцию в строку.Ключевое слово friend подразумевает, что функция не определена в классе, но она может получить доступ ко всем закрытым и защищенным переменным класса.Измените свой код на:

class Student {
  public:
    Student(){}
    void display() const{}
    friend istream& operator>>(istream& is, Student& s);
    friend ostream& operator<<(ostream& os, const Student& s);
};

istream& operator >>(istream& is, Student& s) { return is; }
ostream& operator <<(ostream& os, const Student& s) { return os; }

Посмотрите на http://www.java2s.com/Code/Cpp/Overload/Overloadstreamoperator.htm для другого примера.

С << и >> левый операнд всегда является потоком файлов, поэтомувы не можете перегрузить их внутри вашего фактического класса (технически это должно идти в классе файлового потока).

0 голосов
/ 05 июля 2011

Я забыл, где определен этот оператор, но это будет либо глобальный оператор >>, либо оператор, принадлежащий потоку.

Определение в Студенте - неправильное место.

...