2011-05-29 153 views
0
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 < ---包含读者姓名和类别

例如:

大卫< - 读者的名字
- 大卫是梦幻读者


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

2)Book.txt < ----包含本书的标题和类别

对于离
里迪克< - 书的标题
- 书的类别是幻想


在主函数中,指向Reader的obj的指针数组指向每个dervied类;

ex 

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

主要目标是组织本书的名单,并放入相应类别和相应的阅读器
,并写入到一个新的文本文件。
ex。

-David-
里迪克

-John-
乌鸦



我的问题
我不知道应该是内部操作者< <和运营商的什么>>
适用于课本及课本阅读器

+0

您应该尝试比提出的解决方案更详细地解释问题。例如,'main'中的创建或读者看起来可疑,如果给定类型的书籍有多个读者,书籍如何与读者相关?另一件可疑的事情是读者的类型是用对象的类型编码的,但派生类型不会向基类添加任何东西......空的子类不是那么常见。 – 2011-05-29 12:59:14

回答

6

你应该在过载的< <和>>操作符中放什么?
那么,你实际上可以把任何东西放在超载的<<>>运营商。只要有合适的机会,他们只是简单的函数调用。
对于如:

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前:

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 
} 

因此,底线是,你可以把任何功能里>><<运营商,但不要忘了最少惊讶的原则!

+0

+1,很好的答案。对于这些操作人员,我总是遵循以下经验法则:'<<将物品放入其他物品中,'>>'用于取出物品:) – 2011-05-29 13:46:55

+0

@ Moo-Juice:您可以使用名称中隐藏的类比,>>(提取操作符,从流中提取某些东西)<<(插入运算符,将某些东西插入到流中),提取和插入字是关于流的。 – 2011-05-29 15:06:40