2015-11-17 2 views
1

Я пытаюсь перегрузить оператор '=' и оператор '< <' тем же способом.Зачем использовать функцию друга

class Vect{ 
public: 
    //.. 
    Vect& operator=(const Vect& a);  
    ostream& operator<<(ostream& out, const Vect& vect); 
    //.. 
private: 
    int *data; 
    int size; 
}; 

эта работа

Vect& Vect:: operator=(const Vect& a){ 
//.. 
//copy data operator 
for(int i = 0; i< size; i++){ 
    data[i] = a.data[i]; 
} 
return *this; 
} 

однако: этот код причины ошибки
[Error] станд :: ostream & Vect :: Оператор < < (станд :: ostream &, Const Vect &) 'должен принимать ровно один аргумент

ostream& Vect::operator<<(ostream& out, const Vect& vect){ 
//.. print vect 
} 

Я чтение «Структура структуры данных и алгоритмы в C++» (1.5.4). Они сказали, что я должен использовать друзей класса для перегрузки '< <', потому что это доступ к частным данным членов. Я не понимаю, почему. Перегружая оператор «=», я также получаю доступ к данным частного члена без использования «друга».

+4

Вам не интересна ошибка? Потому что он ничего не говорит о доступе к частным данным. (хотя это, вероятно, также будет проблемой, как только вы устраните проблему, вызывающую текущую ошибку). –

ответ

2

Перегрузки оператор «=» я также получить доступ к конфиденциальным данным члена без использования «друга»

operator= объявлена ​​как функция, которая могла бы получить доступ к закрытому члену.

Они сказали, что я должен использовать класс друг для перегрузки оператора «< <», потому что доступ к данным частных членов. Я не понимаю, почему.

Проблема заключается в том, что вы делят operator<< как функцию-член, которая должна быть объявлена ​​как функция, не являющаяся членом. Вот почему вы получили ошибку.

operator<< должен быть функцией не-mmeber, потому что он нужен другой тип, как его левой аргумента, т.е. std::ostream&, вместо того, чтобы объявить Vect&, когда его в качестве функции члена.

Это означает, что, как функция, не являющиеся члены, operator<< не может получить доступ к закрытому члену класса, если не объявит его как друг, такие как:

class Vect { 
public: 
    //.. 
    friend ostream& operator<<(ostream& out, const Vect& vect); 
    //.. 

Примечание выше синтаксис сделать operator<< Беспоставочные -member теперь.

1

Когда вы помещаете объявление функции внутри определения класса, он становится по умолчанию функция-член, так что ...

class Vect { 
    public: 
    ostream& operator<<(ostream& out, const Vect& vect); 
}; 

... не будет компилироваться, как он запрашивает создание << функции, принимает слишком много аргументов аргументов: любая функция-член operator<<, как ожидается, использует *this как аргумент «левой стороны», а другой аргумент - «правая сторона».

У вас есть два варианта:

  • Replace выше с friend ostream& operator<<(ostream& out, const Vect& vect);, который сообщает компилятору, что функция является другом окружающего класса, но их не член. В качестве члена, не являющегося членом, двумя аргументами, которые он использует, являются out и vect - нет объекта *this. Все это прекрасно работает и, будучи friend, определение также имеет доступ к частным и защищенным данным элемента в vect.

  • Переместить заявление operator<< за пределы определения class Vect; что также делает его функцией, не являющейся членом, но что не сделать ее другом.

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