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)
谢谢
第二个绝对是可取的.您将返回对已更新的对象的引用.对于使用该软件的最终用户,返回的对象不需要删除是不明显的.如果用户执行此类操作,请加上
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对象模式.