2011-09-19 2 views
1

У меня возникла проблема с перегрузкой 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 

ответ

5

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

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) 
         ^^^^^^^^^^^ 

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

+0

Я знаю, что должен, поэтому я смущен, потому что он все еще говорит, что myNum ... является приватным при компиляции. Вот код ошибки, если это поможет. C: \ Users \ Devin \ Documents \ C++ SMCCLASS \ LibrarySystem \ library.h || В функции 'cs52 :: Оператор библиотеки << (std :: ostream &, const cs52 :: Library &)': | C: \ Users \ Devin \ Documents \ C++ SMCCLASS \ LibrarySystem \ library.h | 23 | error: 'int cs52 :: Library :: myNumberOfBooksSeenSoFar' является приватным | –

+0

@ Дэвин: Ты уверен? Для начала прототип функции неправильный. –

+0

@Devin: Проверьте обновленный ответ, я думаю, что это ваша проблема. Обратите внимание на типы параметров! –

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