gpt4 book ai didi

C++11 智能指针用例

转载 作者:太空狗 更新时间:2023-10-29 20:25:41 25 4
gpt4 key购买 nike

假设我正在开发一个小型电影数据库。在像 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 是简单的“数据”类,它应该按值传递,或者更好的是,按常量引用传递。这很简单,但是在第 4 行中检索了另一个对象。由于 Movie 具有“值”语义,按值返回似乎很自然。但是当找不到特定电影时会发生什么?在这种情况下,是抛出异常还是将返回类型更改为智能指针并返回 nullptr 更好?

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

最佳答案

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

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

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

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

关于C++11 智能指针用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23104945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com