Piszę aplikację w C++ współpracującą z bazą danych MySQL. Chciałbym utworzyć obiekty na podstawie danych zwróconych przez zapytanie SQL i dodać je wszystkie do vectora, a następnie zwrócić ten vector jako wynik funkcji. Jak powinienem zrobić to prawidłowo?
Na razie doszedłem do dwóch sposobów:
Sposób 1
//pobieranie obiektu bazy danych (singleton)
DB& db = DB::getInstance();
//wykonywanie zapytania (DBResult to klasa przechowująca to, co zwraca funkcja mysql_query)
DBResult res = db.query("SELECT * FROM entries");
//tu tworzymy nasz wektor
vector<Entry> list;
//rezerwujemy ile miejsca potrzeba
list.reserve(res.numRows());
//w pętli pobieramy wyniki zapytania (DBRow to coś takiego jak std::map)
while(DBRow row = res.fetchAssoc()) {
//tworzenie obiektu
Entry e;
//metoda feed wypełnia obiekt danymi z zapytania
e.feed(row);
//dodawanie obiektu do vectora
list.push_back(e);
}
//zwracanie vectora jako wynik funkcji
return list;
Tutaj problem jest taki, że tworzymy obiekt w pętli, jego kopię dodajemy do wektora, a sam obiekt natychmiast niszczymy. Czyli w praktyce przy każdym obiegu pętli tworzone są dwa obiekty. Jak można to zrobić lepiej?
Sposób 2 (początek tak samo j.w.)
//tworzenie wektora i tworzymy od razu tyle obiektów ile potrzeba
vector<Entry> list(res.numRows());
//w pętli wypełniamy każdy z tych obiektów danymi z bazy
for(int x=0; x<res.numRows(); x++) {
DBRow row = res.fetchAssoc();
list[x].feed(row);
}
Tutaj nie podoba mi się ta pętla for. Wolałbym użyć while tak jak w sposobie nr 1. No i to tworzenie pustych obiektów też nie bardzo mi pasuje. Może lepiej dorobić do klasy Entry konstruktor, który przyjmuje DBRow jako parametr?
Dodatkowe pytania:
- Co jest lepsze: vector<Entry> czy vector<Entry*>? Lepsze w sensie wydajności i łatwości kodowania. Czy jak użyję vector<Entry*> to przy usuwaniu będzie trzeba ręcznie niszczyć obiekty?
- Czy istnieje jakiś oficjalny, zalecany sposób na dodawanie obiektów do vectora?
- Czy gdy usunę vector za pomocą delete to wszytkie obiekty, które on przechowuje zostaną automatycznie zniszczone?