C ++ 11智能指针用例

假设我正在开发一个小型电影数据库。在像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行包含一个Abstract Factory,该工厂返回某个基类的子类,因此这里需要返回一个指针。问题是,应该返回哪种指针?std::unique_ptr似乎很合适。

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

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

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

马丁·巴

情况1 + 2:我认为已经由by最初返回是有意义的shared_ptr,因为在此设计中,数据库连接在本质上似乎是“可共享的”。这样,Case2便可以自行解决。

情况3:Movie通过const引用传递如果Movie是一个类似值的类(并且没有像对象那样昂贵的复制句柄),store则应使用具有const-ref参数的简单单一版本来做到这一点,并使代码保持简单。

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

上一种情况:用于Movie收集按值(std::vector<Movie>)。(在C ++ 11中,返回的向量将始终被移动。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章