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

ng5*_*000 5 c++ interface-design reference pass-by-reference

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

您更喜欢DAL的哪种方法以及为什么出于以下原因:

Car& DAL::loadCar(int id) {}
bool DAL::loadCar(int id, Car& car) {}
Car* DAL::loadCar(int id) {}
Run Code Online (Sandbox Code Playgroud)

如果无法找到汽车第一个方法返回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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Goz*_*Goz 5

第二个绝对是可取的.您将返回对已更新的对象的引用.对于使用该软件的最终用户,返回的对象不需要删除是不明显的.如果用户执行此类操作,请加上

Car myCar = dal.loadCar( id );
Run Code Online (Sandbox Code Playgroud)

指针会丢失.

因此,您的第二种方法将内存控制放在调用方上,并阻止发生任何奇怪的错误.

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

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

你也可以提供

Car DAL::loadCar(int id);
Run Code Online (Sandbox Code Playgroud)

并希望接受堆栈副本.

另外,不要忘记您可以创建一种空车对象,以便返回一个"有效"的对象,但在所有字段中都没有返回有用的信息(因此很明显初始化为垃圾数据).这是Null对象模式.