C ++ DAL - 返回引用或填充参考传递

时间:2009-10-05 13:15:50

标签: 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;
}

由于

2 个答案:

答案 0 :(得分:5)

第二个绝对是可取的。您将返回对已更新的对象的引用。对于使用该软件的最终用户,返回的对象不需要删除是不明显的。如果用户做了类似的事情,请加上

Car myCar = dal.loadCar( id );

指针会丢失。

因此,您的第二种方法会将内存控制权置于调用方并停止发生任何奇怪的错误。

编辑:按引用返回是明智的,但仅当父级(即DAL)类控制引用的生命周期时才有意义。即如果DAL类中有Car对象的向量,则返回引用将是一件非常明智的事情。

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

你也可以提供

Car DAL::loadCar(int id);

希望接受堆栈副本。

另外不要忘记你可以创建一种null car对象,这样你就可以返回一个“有效”的对象,但是在所有字段中都没有返回有用的信息(因此很明显初始化为垃圾数据) 。这是空对象模式。

答案 1 :(得分:4)

因为你总是在堆上分配对象,为什么不考虑Car * LoadCar(),如果出现问题则返回NULL。这样,您对引用类型没有限制(每个引用必须初始化),并且还具有发出错误情况信号的方法。