朋友运营商<<超载问题,

时间:2011-09-19 17:19:46

标签: c++ class operator-overloading private friend

我遇到了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 个答案:

答案 0 :(得分:5)

您的<<运营商应该拥有此原型:

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

他们是不同的!
简而言之,您从未声明过您作为班级朋友访问私有成员的函数,因此错误。 此外,返回类型是不正确的,如前所述。