2011-12-07 9 views
5

Oto mój kod:„sterowanie osiągnie koniec non-void function” ostrzeżenie w Eclipse C++, ale nie compile- lub run-time błędy

Composer& Database::GetComposer (string in_last_name) 
{ 
    for (int i = 0; i < next_slot_; i++) 
    { 
     if (composers_[i].last_name() == in_last_name) 
      return composers_[i]; 
    } 
} 

Pomysł jest iteracyjne nad tablicę obiektów kompozytor i powrotu odniesienie do obiektu, którego nazwa_ostatniego pola pasuje do "in_last_name". Rozumiem, co mówi mi ostrzeżenie, a mianowicie, że funkcja nie zwróci niczego (jeśli, powiedzmy, użytkownik poda niepoprawne nazwisko). Moje pytanie brzmi: jak mogę tego uniknąć? Próbowałem dodać "return 0" i "return NULL" po pętli for i nie skompilowałoby się. Czy ta metoda powinna generować wyjątek, jeśli nic nie znajdzie?

+1

Powinieneś rzucić wyjątek. –

+1

Ostrzeżenia to naprawdę logiczne błędy w kodzie. Napraw wszystkie ostrzeżenia (i zwiększ poziom ostrzeżenia na tak wysoki, jak to możliwe) –

+0

Ciągle otrzymuję to samo ostrzeżenie, nawet jeśli blok try/catch rzuca standardowy wyjątek. – wbr

Odpowiedz

6

Twoja funkcja została zadeklarowana jako zwracająca Composer&, czyli odniesienie do Composer. Jeśli twoja funkcja nie zwróci odpowiedniego odniesienia, a osoba wywołująca spróbuje użyć wartości zwracanej, pojawi się niezdefiniowane zachowanie.

Jeśli funkcja może legalnie nie mogą znaleźć to, co szuka, może chcesz zmienić typ zamiast wrócić do wskaźnik z odniesienia. To by dać Ci możliwość powrotu NULL:

Composer* Database::GetComposer (string in_last_name) 
{ 
    for (int i = 0; i < next_slot_; i++) 
    { 
     if (composers_[i].last_name() == in_last_name) 
      return &composers_[i]; 
    } 
    return NULL; 
} 

Alternatywnie, można rzucić wyjątek, gdy funkcja nie znajdzie cel.

+0

Kiedy to zrobię, pojawia się następujący komunikat o błędzie: "Niepoprawna inicjalizacja niezawartej referencji typu" Composer & "z wartości r type" int " – wbr

+0

Na jakiej linii źródłowej pojawia się ten błąd? –

+0

W tym samym wierszu, co instrukcja return NULL. – wbr