首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11智能指针用例

C++11智能指针用例
EN

Stack Overflow用户
提问于 2014-04-16 09:14:43
回答 3查看 1.1K关注 0票数 3

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

代码语言:javascript
复制
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创建的ConnectionFactory转换为shared_ptr还是修改ConnectionFactory以返回shared_ptr

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

最后,返回对象的集合。最好是返回对象的容器(例如,std::vector),还是返回(智能)指针的容器。在后一种情况下,哪个指针?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-16 09:20:24

案例1+2:我认为最初由shared_ptr返回是有意义的,因为在这个设计中,DB连接似乎具有内在的“共享性”。这样,Case2就可以自行解决问题。

案例3:通过const引用传递Movie。如果Movie是一个类似值的类(并且没有任何昂贵的复制句柄类),那么带有const-ref参数的store的一个简单版本就应该做到这一点,并保持代码简单。

如果需要在fetch方法中建模"not“,请使用boost::optional<Movie> (或类似的)作为返回值。

案例最后:对于Movie,使用集合的值(std::vector<Movie>)。(在C++11中,返回的向量无论如何都会被移动。)

票数 3
EN

Stack Overflow用户

发布于 2014-04-16 11:50:30

db = ConnectionFactory.get_connection(db_name) # (1)创建数据库连接

谁拥有分局?当它被摧毁时?

  1. 这个堆栈拥有它,应该最终销毁它,=>使用std::unique_ptr
  2. 这将保存在类(如MovieManager)成员中,并且该类将在所有其他对象( => )使用std::unique_ptr并将原始指针传递给其他对象的情况下存活。
  3. db可能比此堆栈和类更长,并且与其他对象=> std::shared_ptr共享。

注在所有上述情况下,工厂应该只返回一个unique_ptr,除非它返回一个现有的共享连接(在这种情况下它是一个shared_ptr )。unique_ptr可以自动升级到shared_ptr

model = MovieModel(db) # (2)对象到关系映射器

  1. 如果db是std::unique_ptr,并且希望MoviewModel从现在起获得所有权,则std::move(db)
  2. 模型将在此堆栈中销毁,传递db.get()
  3. 模型需要共享所有权,因为任何模型都可能最后被销毁,作为shared_ptr传递

star_wars =电影(“星球大战”)model.store(star_wars) # (3)保存对象

有两种选择:

  1. 使const Movie&Movie&&的存储重载
  2. 使商店以价值收视电影

如果不想在此函数中再次使用star_wars,请调用std::move(star_wars)

et = model.fetch("E.T.") # (4)检索一个对象

异常对象或optional<Movie>

model.fetch_all() # (5)检索所有对象

std::vector<Movie>

票数 2
EN

Stack Overflow用户

发布于 2014-04-16 09:26:54

编辑:我在这里说了一些不太聪明的事情,完全忽略了标题中的C++11。

个人对第三和第五条的看法:

( 3)我想不出有什么理由在这里使用价值而不是引用。至少只要储存不是以某种非常不寻常的方式发生。

最后一点:我总是希望有一个指针容器来最小化内存的随机复制。在C++11中,您可能可以在其中使用unique_ptr或shared_ptr,这取决于以后使用的是什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23104945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档