c++继承中有关shared_ptr的一些疑问

sinat_27233737 sinat_27233737 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

class Basket {
public:
void add_item(const std::shared_ptr<Quote>& q) {
item.insert(q);
}
double print_price(std::ostream& os) const{
double sum=0;
for (auto i = item.cbegin(); i != item.cend(); i = item.upper_bound(*i)) {
sum += print_total(os, **i, item.count(*i));
}
os << "书的总价格为:" << sum << std::endl;
return sum;
}
private:
static bool compare(const std::shared_ptr<Quote> &p, const std::shared_ptr<Quote> &q) {
return p->bookNo < q->bookNo;
}
std::multiset<std::shared_ptr<Quote>,decltype(compare)*> item{compare};//2、这里也不太懂
};


其中,BulkQuote是Quote的派生类,代表有打折的书。

int main() {
Basket basket;
BulkQuote a("a", 10, 5, 0.5);
basket.add_item(make_shared<BulkQuote>(a));//1、这里不懂!
basket.print_price(cout);


1、这里为什么写成“ basket.add_item(make_shared<BulkQuote>(a));”就不行,调用的是静态类型,即Quote,得到的是没打折时的价格?非要写成basket.add_item(make_shared<BulkQuote>(“a”,10,5,0.5));才可以呢?
还有,为什么不可以写成"basket.add_item(new BulkQuote(a));"提示"不存在从'BulkQuote*'到std::shared_ptr<Quote>"的适当构造函数?

2、 item{compare}这里为什么要定义成花括号,之前这里不都是定义成圆括号的吗?还有compare函数需要定义成static的呢?
...全文

相关推荐

求教C++等等一系列的问题

这是一个值得人深思的事情,希望莘莘学子能都好好的考虑一下这些内容的背后

liangang1986

C/C++中文帮助文档.chm

c/c++的中文帮助chm文档。详细介绍了c/c++的标准库函数的使用方法和作用。 chm格式,查询方便,真实可用。

O_MMMM_O

C++Primer第五版习题答案

C++Primer第五版书后答案,包括格个章节的课后习题源代码。

男人如花花易落

C++参考手册.zip

C++中文参考手册。CHM格式,不用安装阅读软件,可以直接打开,而且如果你经常用到C++的话,它可是你必不缺少的查询手册。

syf_888

【C++ 深入浅出】智能指针shared_ptr、unique_ptr、weak_ptr详解

xx智能指针:防止用户忘记释放掉指针所指的堆空间而造成内存泄漏 当一个对象应该被释放时,指向它的智能指针可以确保自动地释放它 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一

NEDL001
评论 4
收藏 已收藏
分享
返回顶部
sinat_27233737
新手乐园 33,315 成员 41,769 内容