[EDIT 1 - dodał składnia trzeci wskaźnik (Dzięki Alex)]C++ DAL - Powrót referencyjny lub wypełnić Przekazywana w odniesieniu
Która metoda wolisz dla DAL i dlaczego z:
Car& DAL::loadCar(int id) {}
bool DAL::loadCar(int id, Car& car) {}
Car* DAL::loadCar(int id) {}
Jeśli nie uda się znaleźć samochodu, pierwsza metoda zwróci wartość null, druga metoda zwróci wartość false.
Druga metoda spowoduje utworzenie obiektu Car na stercie i wypełnienie danymi wyszukanymi z bazy danych. Przypuszczalnie (mój C++ jest bardzo zardzewiały) oznaczałoby to kod wzdłuż linii:
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;
}
Thanks
Dzięki. Nawet jeśli osoba dzwoniąca napisała "Car & myCar = dal.loadCar (id)", czy wskaźnik nie zostałby utracony? Czy istnieje mimo to kod non-DAL, aby usunąć pamięć utworzoną przez DAL? – ng5000
Nie, jeśli osoba dzwoniąca napisała to, co napisałeś, pamięć "może" być wolna. Musisz zadzwonić "usuń &myCar;", aby to zrobić .. co wygląda bardzo dziwnie. – Goz
Kopiowanie stosu może się nawet nie zdarzyć: w zależności od kompilatora i optymalizacji, (N) RVO może się uruchomić i wykonać operację równoważną # 1. W każdym razie, wyrzucenie wyjątku, gdy samochód nie zostanie znaleziony, będzie konieczne. –