2016-03-31 10 views
2

Ich habe derzeit ein Programm für eine Fluggesellschaft Reservierungsdatenbank, die list<string>flight_list und string name (die nur der Nachname ist) verwendet. Ich muss dieses Programm so erweitern, dass es eine verknüpfte Verknüpfung von Passagier-Objekten statt Strings speichert, nehme ich an, indem ich es auf list<Passenger> passenger_list ändere? Ich habe Probleme zu verstehen, wie ich die Funktionen in meiner Klasse umwandeln kann, um diese Änderung zu berücksichtigen. Das Passagierobjekt muss den Vornamen, den Nachnamen und den Zielort jedes Passagiers enthalten. Es gibt eine Menge, aber diese sind ein paar der Funktionen als Beispiel:Fluggesellschaft Reservierungsliste Programm

void read_from_file(list<string>& flist, string filename) 
{ 
    string name; 
    ifstream input(filename.c_str()); 
    while (input >> name) 
    {     
     flist.push_back(name); 
    } 
    input.close(); 
} 

void insert(list<string>& flist, string name) 
{ 
    flist.push_back(name); 
} 

bool check_reservation(list<string>& flist, string name) 
{ 
    list<string>::iterator i1, i2; 
    i1 = flist.begin(); 
    i2 = flist.end(); 
    return (find(i1, i2, name) != i2); 
} 

ich mit einem main.cc Klasse und einer database.cc Klasse arbeitete. Also, ja, irgendwelche Tipps, wie man die Klassen verallgemeinern könnte, wären bitte willkommen.

+0

Sie können prüfen, diese Frage stellen an: http://programmers.stackexchange.com/ –

Antwort

1

Einige Beobachtungen, die ich hoffe hilfreich (aber sei vorsichtig: der folgende Code ist nicht getestet).

Wenn Ihr Passenger Vornamen, Nachname und Ziel benötigen, nehme ich an, dass es einen Passenger Konstruktor mit drei String-Parametern gibt.

Ich nehme an, dass Ihre Read_from_file() so etwas wie

void read_from_file(list<Passenger> & flist, string const & filename) 
{ 
    string firstN, lastN, dest; 
    ifstream input(filename.c_str()); 
    while (input >> firstN >> lastN >> dest) 
    {     
     flist.push_back(Passenger(firstN, lastN, dest)); // for C++98 
     // flist.emplace_back(fistN, lastN, dest); // for C++11/14 
    } 
    // input.close(); no need for close: file closed by destructor 
} 

Vorschlag werden soll: pass Parameter Bezug genommen wird, und unter Verwendung von const, wenn möglich.

Auch die insert() kann auf einfache Weise angepasst werden (in zwei verschiedenen Modi, je nachdem, ob Sie einen aktuellen C++ Compiler oder pre C++ 11 verwenden)

void insert(list<Passenger> & flist, string const & firstN, 
      string const & lastN, string const & dest) 
{ 
    flist.push_back(Passenger(firsN, lastN, dest)); // C++98 version 
    // flist.emplace_back(firsN, lastN, dest); // C++11/14 version 
} 

Weniger offensichtlich, wie man check_reservation(). Und wirklich abhängig von der C++ 98/C++ 11 Frage.

Ich nehme an, dass Sie eine check_reservation() möchten, die einen Passenger geben Vorname, Nachname und Ziel finden möchten.

In C++ 11 ist ziemlich einfach (angenommen Ihre Passenger enthält eine firsN, ein lastN und ein dest Mitglied)

bool check_reservation(list<Passenger> const & flist, string const & firstN, 
         string const & lastN, string const & dest) 
{ 
    return flist.cend() != find_if(flist.cbegin(), flist.cend(), 
           [&](Passenger const & p) 
            (return (fistN == p.fistN) 
              && (lastN == p.lastN) 
              && (dest == p.dest);)); 
} 

In C++ 98 Sie Lambda-Funktionen haben nicht so komplizierter ist . Sie müssen einen Funktor zum Vergleich konstruieren; so etwas wie

struct person_eq : std::unary_function <Passenger, bool> 
{ 
    string const & f; 
    string const & l; 
    string const & d; 

    person_eq (string const & f0, string const & l0, string const & d0) 
     : f(f0), l(l0), d(d0) 
     {} 
    bool operator() (Passenger const & p) const 
    { return (p.firstN == f) && (p.lastN == l) && (p.dest == d); } 
}; 

und Ihre check_reservation() sollte so etwas wie

bool check_reservation(list<Passenger> const & flist, string const & firstN, 
          string const & lastN, string const & dest) 
    { 
     return flist.cend() != find_if(flist.cbegin(), flist.cend(), 
            person_eq(fistN, lastN, dest)); 
    } 

Ich wiederhole geworden: dieser Code nicht getestet ist, so vorsichtig sein.

ps.entschuldigung für mein schlechtes Englisch.

bearbeiten

Leider, wenn es die operator== für Ihre Passenger definiert ist, kann Ihr check_reservation() wirklich

bool check_reservation(list<Passenger> const & flist, string const & firstN, 
         string const & lastN, string const & dest) 
{ 
    return flist.cend() != find(flist.cbegin(), flist.cend(), 
           Passenger(firstN, lastN, dest)); 
} 
+0

Dankhaufen! Ich habe es noch nicht getestet, aber das hat definitiv deutlich gemacht, was ich für den Rest der Funktionen auch tun muss. Ich schätze es! – Brittany

0

class Passenger richtig definieren einfach und alles andere (Fein Passagier einen Namen usw. usw. geben .) wird viel einfacher für Sie und alle anderen, die zufällig Glück haben, es in Zukunft zu erhalten.

Denken durch und implementieren folgende für class Passenger:

destructor 
copy constructor 
copy assignment operator 

Viel Glück! Wenn Sie auf ein bestimmtes Problem mit Ihrem C++ - Code stoßen, geben Sie es als separate Frage ein.

Referenz: https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)#Rule_of_Three