其他分享
首页 > 其他分享> > C 11智能指针使用案例

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行包含一个抽象工厂,它返回一些基类的子类,因此这里需要返回一个指针.问题是,应该返回什么样的指针? 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