ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C 11智能指针使用案例

2019-08-25 06:07:23  阅读:336  来源: 互联网

标签:c c11 smart-pointers


我们假设我正在开发一个小型电影数据库.在像python这样的动态语言中,我写道:

db = ConnectionFactory.get_connection(db_name) # (1) Create database connection
model = MovieModel(db)                         # (2) object-to-relational mapper
star_wars = Movie("Star Wars", ...)
model.store(star_wars)                         # (3) Save object
et = model.fetch("E.T.")                       # (4) Retrieve one object
movies = model.fetch_all()                     # (5) Retrieve all objects

当将其转换为C时,问题就出现了如何传递对象:通过值,通过引用,通过普通指针或通过一些智能指针之一.

第1行包含一个抽象工厂,它返回一些基类的子类,因此这里需要返回一个指针.问题是,应该返回什么样的指针? std :: unique_ptr似乎很合适.

在第2行中构造了MovieModel,它将数据库连接作为参数并存储以供将来使用.由于一个连接可以在一个或多个模型之间共享,因此我应该传递数据库连接并将其存储为std :: shared_ptr.但是,我应该将ConnectionFactory创建的std :: unique_ptr转换为shared_ptr还是修改ConnectionFactory以返回shared_ptr?

在第3行中,对象存储在数据库中.由于Movie是简单的“数据”类,它应该通过const引用传递值,或者更好.这很简单,但在第4行中检索另一个对象.由于Movie具有“价值”语义,因此按值返回似乎很自然.但是当找不到特定的电影时会发生什么?抛出异常,或者将返回类型更改为智能指针并在这种情况下返回nullptr会更好吗?

最后,返回一组对象.返回对象的容器(例如,std :: vector)或(智能)指针的容器是否更好?在后一种情况下,哪些指针?

解决方法:

案例1 2:我认为最初由shared_ptr返回是有意义的,因为数据库连接在本设计中似乎本质上是“可共享的”.这样,Case2解决了自己.

案例3:通过const引用传递电影.如果Movie是一个类似值的类(并且没有任何昂贵的复制句柄之类的东西),那么带有const-ref参数的简单单一版本的商店应该这样做并保持代码简单.

如果您需要在fetch方法中对“not found”进行建模,请使用boost :: optional< Movie> (或类似的东西)作为返回值.

案例最后:对于Movieuse一个集合按值(std :: vector< Movie>). (在C 11中,无论如何都会移动返回的矢量.)

标签:c,c11,smart-pointers
来源: https://codeday.me/bug/20190825/1715858.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有