gpt4 book ai didi

C++ DAL - 返回引用或填充传入引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:19 26 4
gpt4 key购买 nike

[编辑 1 - 添加了第三个指针语法(感谢 Alex)]

对于 DAL,您更喜欢哪种方法,为什么不:

Car& DAL::loadCar(int id) {}
bool DAL::loadCar(int id, Car& car) {}
Car* DAL::loadCar(int id) {}

如果找不到车第一个方法返回null,第二个方法返回false。

第二种方法将在堆上创建一个 Car 对象并填充从数据库中查询的数据。据推测(我的 C++ 非常生锈)这意味着代码如下:

Car& DAL::loadCar(int id)
{
Car *carPtr = new Car();
Car &car= *carPtr;
car.setModel(/* value from database */);
car.setEngineSize(/* value from database */);
// etc
return car;
}

谢谢

最佳答案

第二种绝对更可取。您正在返回对已新建对象的引用。对于使用该软件的最终用户来说,返回的对象是否需要删除并不明显。加上如果用户做这样的事情

Car myCar = dal.loadCar( id );

指针会丢失。

因此,您的第二种方法将内存控制权交给调用者,并阻止发生任何奇怪的错误。

编辑:通过引用返回是明智的,但只有当父级(即 DAL)类可以控制引用的生命周期时。也就是说,如果 DAL 类中有一个 Car 对象 vector ,那么返回一个引用将是一件非常明智的事情。

Edit2:我仍然更喜欢第二种设置。第三个比第一个好得多,但你最终让调用者假设对象已初始化。

你也可以提供

Car DAL::loadCar(int id);

并希望接受堆栈拷贝。

另外不要忘记,您可以创建一种空汽车对象,这样您就可以返回一个“有效”的对象,但在所有字段中都不会返回任何有用的信息(因此显然被初始化为垃圾数据) .这就是空对象模式。

关于C++ DAL - 返回引用或填充传入引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520018/

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