2016-02-08 12 views
0

У меня есть базовый класс Student (должен быть классом) (да, нет инкапсуляции, а также пропущено PLUS), и я хотел бы создать пользовательские операторы извлечения и вставки. После бесчисленных поисков он все равно не сработает. То, что я этоРеализация оператора извлечения и вставки C++

#ifndef student 
#define student 

#include <iostream> 
#include <string> 

using namespace std; 

class Student 
{ 
    public: 
     string name; 
     double score; 

     Student(); 
     Student(string name, double score) : name(name), score(score) {} 

     friend ostream& operator<<(ostream &out, Student &student); 
     friend istream& operator>>(istream &in, Student &student); 
}; 

#endif 

#include "student.h" 

ostream& operator<<(ostream &out, Student &student) 
{ 
    out << student.name << ", " << student.score; 
    return out; 
} 

istream& operator>>(istream &in, Student &student) 
{ 
    if (!in >> name || !in >> score) 
    { 
     in.setstate(ios::failbit); 
    } 
    return in; 
} 

Я пробовал много вещей из this-> имя Student :: имя назвать студенческим :: student.name к изменению функции подписи, которая на самом деле в конечном итоге работает, за исключением того, что фактически не перегружает оператора. pls halp: D

Редактировать: Что касается конкретной проблемы, он выполняет член класса Student внутри метода. student.name и student.score бросают в

expected primary-expression before '.' token 

и нижний просто пережиток бросали другое решение на него, но это ошибка области видимости.

Edit2: Проблема оказаться конфликт с охранником в заголовке называют студентом, таким образом, препроцессор бы атомной бомбой студента слова везде -_- Спасибо за помощь

+1

Добро пожаловать в StackOverflow! Какое фактическое сообщение об ошибке вы получаете? – mindriot

+1

в 'operator >>', вы не можете просто «имя» и «оценка». Кроме того: вы на самом деле не говорите нам, в чем проблема (ошибка компилятора, укажите точный текст. Ошибка времени выполнения? Расскажите, в какой строке возникает ошибка). – crashmstr

+2

Две быстрые заметки: (1) в вашем 'operator <<()', вы должны использовать 'const Student &' (объект не изменяется). (2) В вашей реализации 'operator >>()' вы можете просто написать 'return (in >> name >> score);', не нужно беспокоиться о состоянии самостоятельно, это позаботится. – mindriot

ответ

4

В комментариях и в ответе капитана Жирафа были указаны различные проблемы. Еще одна важная проблема заключается в следующем:

В ваших функциях объявляется переменная с именем student; но ваш заголовок фактически #define s student в защитнике заголовка! Таким образом, ваш символ #define d сталкивается с вашим именем переменной, в результате чего вы видите ошибки. Рекомендуемым синтаксисом для защиты заголовка является что-то вроде

#define STUDENT_H_INCLUDED 
+0

o теперь я получаю ошибку на studnet.name и student.score ... im dumb: D спасибо. Я думаю, что затмение _guard лучше, чем я думал. –

+1

Или, если вы можете, '#pragma once' и избавиться от включения охранников. – DeathTails

+0

@BorisN Не беспокойтесь, вы учитесь :) – mindriot

3

Я вижу несколько проблемы с вашим >>

if (!in >> name || !in >> score) 

! имеет более высокий приоритет, чем >>, использовать! (в >> student.name)

использование student.name и student.score

Подобно тому, как вы это делали в предыдущем оператора.

Полезно использовать ссылку на const для второго аргумента для оператора <<. Измените декларацию друга соответственно.

+0

спасибо, я заметил, что в основном файле, но я думаю, что это уклонилось от моего ума из-за ошибок. Спасибо –

+0

Кроме того, параметр 'failbit' - плохая идея, потому что если' in >> 'failed, то он уже установите это. Функция может быть просто 'in >> student.name >> student.score; return in; ' –

+0

А цепочка. Забыл об этом. Хорошее предложение –