c ++重载运算符<<和运算符>>

时间:2011-05-29 12:06:14

标签: c++

class Book
{ 
     string title;
     int category;
 public:
    Book(const string& abook, int num);
    string getTitle() const;
    int getCategory() const;
    friend ostream& operator<<(ostream& os, const Book& abook);
    friend istream& operator>>(istream& is, Book& abook);
 };

class Reader  // base class
{
private:
    string reader_name;
    vector<Book> bookLists;
public:
   string showname() const;
   void add(const Book& abook);    // organize book list
   friend ostream& operator<<(ostream& os, const Reader& read_name);
   friend istream& operator>>(istream& is, Reader& read_name);
};

 class fantasyReader : public Reader {  };
 class horrorReader : public Reader { };
 class scienceReader : public Reader { } ;
class mysteryReader : public Reader { };

我有两个给定的文本文件 1)Reader.txt&lt; ---包含读者的姓名和类别

例如,
大卫&lt; - 读者姓名
0&lt; - david是幻想读者

2)Book.txt&lt; ----包含书的标题和类别

对于前任 Riddick&lt; - 书的标题
0&lt; - 书的类别是幻想


在main函数中,指向Reader的obj的指针数组指向每个已分类的类;

 ex

Reader *obj[10];
int pos =0;
obj[pos++] = new fantasyReader();

主要目标是整理书籍清单并将其放入适当的类别和适当的读者,并将其写入新的文本文件。
恩。

-David-
里迪克

-John-
乌鸦



我的问题
我不确定运营商内部应该是什么&lt;&lt;和运算符&gt;&gt;
课堂书和班级读者

1 个答案:

答案 0 :(得分:6)

你应该把什么放在重载的&lt;&lt;和&gt;&gt;运营商吗
好吧,您实际上可以在重载的<<>>运算符中放置任何内容。只要有合适的机会,它们就是简单的函数调用 例如:

Book obj;
cout<< obj;  //Calls your overloaded << operator

作为重载运算符的一般原则,您应该遵循 最小惊讶原则 ,这意味着您的代码应该执行与运算符对内部数据类型类似的操作。在上面的例子中,我希望我的<<运算符显示我的Book类的内容,在这种情况下,我会按如下方式重载它:

// Display title and category 
ostream& operator<<(ostream& os, const Book& abook);
{
    os << abook.title << "\n";
    os << abook.category<< "\n";

    return os; // must return ostream object
}

我需要返回一个流对象,因为它允许chaining ex:

Book obj1,obj2,obj3;
cout<<obj1<<obj2<<obj3;

同样,对于>>抽取运算符,我希望运算符从用户那里获取数据。 例如:

Book obj;
cin>>obj; //Calls your overloaded >> operator

我会按如下方式重载>>运算符:

//Get the Book Title & Category from User
istream& operator>>(istream& is, Book& abook)
{
    cout << "Enter Book Title: ";
    is >> abook.title ;
    cout << "Enter Book Category: ";
    is >> abook.category;

    return is;  //Must return stream object
}

所以,底线是你可以在>><<运算符中放置任何功能,但不要忘记最小惊讶的原则!