Друг Оператор << проблемы с перегрузкой, - PullRequest
1 голос
/ 19 сентября 2011

У меня проблема с моей перегрузкой operator<<, когда я не могу получить доступ к закрытым переменным класса, это не имеет значения, что я делаю, потому что это скажет, что переменные являются личными как ошибка компилятора.Это мой текущий код:

#include "library.h"
#include "Book.h"

using namespace cs52;

Library::Library(){
   myNumberOfBooksSeenSoFar=0;
}
//skipping most of the functions here for space

Library operator << ( ostream &out, const Library & l ){
   int i=myNumberOfBooksSeenSoFar;
   while(i<=0)
   {
      cout<< "Book ";
      cout<<i;
      cout<< "in library is:";
      cout<< l.myBooks[i].getTitle();
      cout<< ", ";
      cout<< l.myBooks[i].getAuthor();
   }


   return (out);
}

И прототип функции и частные переменные в library.h имеют значение

#ifndef LIBRARY_H
#define LIBRARY_H
#define BookNotFound 1
#include "Book.h"
#include <iostream>
#include <cstdlib>

using namespace std;

namespace cs52{

   class Library{
   public:
      Library();
      void newBook( string title, string author );
      void checkout( string title, string author ) {throw (BookNotFound);}
      void returnBook( string title, string author ) {throw (BookNotFound);}
      friend Library operator << ( Library& out, const Library & l );

   private:

      Book myBooks[ 20 ];
      int myNumberOfBooksSeenSoFar;

   };
}
#endif

1 Ответ

5 голосов
/ 19 сентября 2011

Ваш оператор << должен иметь этот прототип:

std::ostream& operator << ( std::ostream &out, const Library & l )
^^^^^^^^^^^^^

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

Кроме того, если вы объявите его своим другом в своем классе Library, вы сможете получить доступ ко всем членам (частным / защищенным) класса Library в вашей перегруженной функции.


Как таковой, я не понимаю ваш код. Вы объявили свой оператор << как:

friend Library operator << ( Library& out, const Library & l );
                             ^^^^^^^^^^^^

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

Library operator << ( ostream &out, const Library & l )
                      ^^^^^^^^^^^

ОниDifferent!
Короче говоря, вы никогда не объявляли функцию, к которой вы обращаетесь к приватному члену, как к другу вашего класса и, следовательно, к ошибке.Кроме того, тип возврата является неправильным, как я уже упоминал ранее.

...