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;
课堂书和班级读者
答案 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
}
所以,底线是你可以在>>
和<<
运算符中放置任何功能,但不要忘记最小惊讶的原则!