gpt4 book ai didi

c++ - 重载流媒体运营商问题

转载 作者:行者123 更新时间:2023-11-30 04:22:26 25 4
gpt4 key购买 nike

我在通过运算符重载进行打印时遇到问题。目前我正在创建一个数据库,其中包含一个 Item 类作为基类,Item 的派生类是 Movie、Book 和 MusicAlbum。以下是如何将一本书插入图书馆的示例:

Item    *item;

cout << ">>>>>> adding items to library:" << endl << endl;
item = library->addBook("The Curious Incident of the Dog in the Night-Time", "Mark Haddon", 240);
if (item != NULL) {
library->addKeywordsForItem(item, 2, "autism", "Asperger's Syndrome");
cout << item << endl;
}

其中addBook是类Library中定义的一个函数,addKeywordsForItem也是如此。我的问题是:cout << 项目 << endl;

我知道我需要重载流式传输 << 运算符才能执行此操作,但我的主要功能(这是上面代码的来源)也包括用于添加电影和音乐专辑的类似功能。我重载流运算符的函数位于我的基类中,并接收一个基类指针作为参数,如下所示:

ostream& operator<<(ostream& out, const Item* item);

对于书籍,我需要打印标题、作者、页数和关键字。对于电影和音乐专辑,也有特定的内容可以打印。

我如何才能只使用我的基类中一个重载流式运算符的函数来打印我需要的任何信息?不管基类指针指的是 Book、Movie 还是 MusicAlbum 的实例?提前致谢。

最佳答案

通常是有一个转发到虚函数的全局重载:

struct Base {    
virtual std::ostream &print(std::ostream &os) const {
return os << base_data;
}
};

struct Derived : Base {
virtual std::ostream &print(std::ostream *os) const {
return os << derived_data;
}
};

std::ostream &operator<<(std::ostream &os, base const &b) {
return b.print(os);
}

每个派生类都会覆盖 print根据需要将自身打印到流上。自 operator<<需要 Base通过引用,它可以使用正常的虚拟调度转发到 print 的实现根据接收到的对象的动态类型在正确的类中。

关于c++ - 重载流媒体运营商问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13814007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com