2015-04-13 5 views
1

Я пытаюсь написать перегруженные операторы ввода и перенапряжения, но функции не могут получить доступ к закрытым членам класса Money.I имеют «include namespace std;» и "#include", но он не позволит мне получить доступ к частным членам (в долларах и центах).Личные элементы данных недоступны для функции друга

ostream & operator<<(ostream &osObject, Money &right) 
{ 
    osObject << "Amount of money: $" << right.dollars << "."; 
    osObject << right.cents; 

    return osObject; 
} 

istream &operator>>(istream &isObject, Money &right) 
{ 
    isObject >> right.dollars; 
    isObject.ignore(); 
    getline(isObject, right.cents; 

    return isObject; 
}` 

Заголовок файла:

#pragma once 
class Money{ 
    // Friends 
    friend ostream & operator<<(ostream, Money); 
    friend istream & operator>>(istream, Money); 
private: 
    int dollars; 
    int cents; 
    void simplify(); 
//Some other stuff... 

Я получаю ошибки, такие как: синтаксической ошибки: недостающего ';' до '&' 'ostream': 'friend' не разрешено в объявлениях о дате отсутствует спецификатор типа-int. C++ не поддерживает default-int

+9

Подписи деклараций и определений функций должны совпадать. – juanchopanza

+0

Я также предполагаю, что 'getline (isObject, right.cents;' просто опечатка ... – vsoftco

ответ

0

juanchopanza уже дал ответ в своем комментарии. На всякий случай, если вы хотите увидеть его на действии:

friend ostream & operator<<(ostream&, Money); 
friend istream & operator>>(istream&, Money); 

Отсутствуют ссылки на знаки-аргументы ostream и istream.

+0

Второй параметр также является ссылкой в ​​определениях функций OP. –

3

Ваше определение функции является

ostream & operator<<(ostream &osObject, Money &right) 

Ваш прототип

friend ostream & operator<<(ostream, Money); 

Это не то же самое, потому что первый принимает опорный ostream аргумент, а второй использует обычный объект ostream. Вам необходимо сделать следующие совпадения:

friend ostream & operator<<(ostream &, Money &); 
+1

О да, это была глупая ошибка с моей стороны, но это все еще дает мне «недоступную» ошибку. Я добавил «using namespace std» в мой заголовочный файл, который решил проблему с моим оператором ostream, но он все еще не может получить доступ к istream - и спасибо за вашу помощь! – MadelineStates

Смежные вопросы