假设我正在开发一个小型电影数据库。在像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创建的ConnectionFactory转换为shared_ptr还是修改ConnectionFactory以返回shared_ptr?
在第3行中,存储在数据库中的对象。由于Movie是一个简单的“数据”类,所以应该通过const引用传递它的值,或者更好。这很简单,但是在第4行中检索了另一个对象。由于Movie具有“值”语义,因此按值返回似乎是很自然的。但是当没有找到特定的电影时会发生什么呢?在这种情况下,最好是抛出异常,还是将返回类型更改为智能指针并返回nullptr?
最后,返回对象的集合。最好是返回对象的容器(例如,std::vector),还是返回(智能)指针的容器。在后一种情况下,哪个指针?
发布于 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中,返回的向量无论如何都会被移动。)
发布于 2014-04-16 11:50:30
db = ConnectionFactory.get_connection(db_name) # (1)创建数据库连接
谁拥有分局?当它被摧毁时?
std::unique_ptrstd::unique_ptr并将原始指针传递给其他对象的情况下存活。std::shared_ptr共享。注在所有上述情况下,工厂应该只返回一个unique_ptr,除非它返回一个现有的共享连接(在这种情况下它是一个shared_ptr )。unique_ptr可以自动升级到shared_ptr
model = MovieModel(db) # (2)对象到关系映射器
std::move(db)db.get()star_wars =电影(“星球大战”)model.store(star_wars) # (3)保存对象
有两种选择:
const Movie&和Movie&&的存储重载如果不想在此函数中再次使用star_wars,请调用std::move(star_wars)
et = model.fetch("E.T.") # (4)检索一个对象
异常对象或optional<Movie>
model.fetch_all() # (5)检索所有对象
std::vector<Movie>
发布于 2014-04-16 09:26:54
编辑:我在这里说了一些不太聪明的事情,完全忽略了标题中的C++11。
个人对第三和第五条的看法:
( 3)我想不出有什么理由在这里使用价值而不是引用。至少只要储存不是以某种非常不寻常的方式发生。
最后一点:我总是希望有一个指针容器来最小化内存的随机复制。在C++11中,您可能可以在其中使用unique_ptr或shared_ptr,这取决于以后使用的是什么。
https://stackoverflow.com/questions/23104945
复制相似问题