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

标签 c++ reference pass-by-reference interface-design

[编辑 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/

相关文章:

c++ - 为什么这个c++程序可以编译?

visual-studio-2010 - 为什么我的 Visual Studio 2010 Silverlight 解决方案在 "Clean"上完全中断?

java - 为什么我的wrapped int没有保留这个方法所做的更改?

C - 按值传递和按引用传递不一致

c - 在c中使用参数作为输出

c++ - QtPlugin 无法加载库

c++ - 如何知道 MPI 请求的接收者和发送者

c++ - 通过引用传递 - 左值和 vector

通过引用获取操作数的 c# 乘法运算符

c++ - 跨不同线程删除插槽内的堆分配对象是否安全?