5

[编辑 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;
}

谢谢

4

2 回答 2

5

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

Car myCar = dal.loadCar( id );

指针会丢失。

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

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

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

您还可以提供

Car DAL::loadCar(int id);

并希望接受堆栈副本。

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

于 2009-10-05T13:22:24.023 回答
4

既然您无论如何都在堆上分配对象,为什么不考虑 Car * LoadCar() 如果出现问题,它会返回 NULL。这样,您对引用类型没有任何限制(每个引用都必须初始化),并且还可以指示错误情况。

于 2009-10-05T13:28:17.180 回答