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