C ++ DAL - возвращаемая ссылка или заполненная ссылка - PullRequest
5 голосов
/ 05 октября 2009

[EDIT 1 - добавлен синтаксис третьего указателя (спасибо, Алекс)]

Какой метод вы бы предпочли для DAL и почему из:

Car& DAL::loadCar(int id) {}
bool DAL::loadCar(int id, Car& car) {}
Car* DAL::loadCar(int id) {}

Если не удается найти автомобильпервый метод возвращает ноль, второй метод возвращает ложь.

Второй метод создает объект 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 ]

5 голосов
/ 05 октября 2009

Второй, безусловно, предпочтительнее. Вы возвращаете ссылку на объект, который был новым. Для конечного пользователя, использующего программное обеспечение, не очевидно, что возвращаемый объект потребует удаления. ПЛЮС, если пользователь делает что-то подобное

Car myCar = dal.loadCar( id );

Указатель будет потерян.

Таким образом, ваш второй метод устанавливает контроль над памятью для вызывающего и предотвращает возникновение любых странных ошибок.

Редактировать: возврат по ссылке имеет смысл, но только когда родительский класс, то есть DAL, контролирует время жизни ссылки. т. е. если бы в классе DAL был вектор объектов Car, возвращение ссылки было бы вполне разумным.

Edit2: я бы все же предпочел вторую настройку. 3-й намного лучше, чем первый, но вы в конечном итоге заставляете абонента предполагать, что объект инициализирован.

Вы также можете предоставить

Car DAL::loadCar(int id);

И, надеюсь, примите копию стека.

Также не забывайте, что вы можете создать своего рода нулевой автомобильный объект, чтобы вы возвращали объект, который является «действительным» ишем, но не возвращает вам никакой полезной информации во всех полях (и, таким образом, очевидно, инициализируется для мусорных данных) , Это шаблон нулевого объекта.

4 голосов
/ 05 октября 2009

Так как вы в любом случае размещаете объекты в куче, почему бы не рассмотреть Car * LoadCar (), который возвращает NULL, если возникает проблема. Таким образом, у вас нет ограничений для ссылочных типов (каждая ссылка должна быть инициализирована), а также есть средства для оповещения об ошибке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...