2016-03-31 3 views
2

В настоящее время у меня есть программа для базы данных бронирования авиакомпаний, в которой используются и string name (что является исключительно фамилией). Мне нужно расширить эту программу, чтобы сохранить связанные связанные объекты Passenger вместо строк, я предполагаю, изменив ее на list<Passenger> passenger_list? У меня возникли проблемы с пониманием того, как преобразовать функции внутри моего класса для адаптации к этим изменениям. Пассажирский объект должен содержать имя, фамилию и назначение каждого пассажира. Там очень много, но это несколько функций в качестве примера:Программа со связанными списками резервирования авиакомпаний

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); 
} 

Я работаю с классом main.cc и классом database.cc. Так что да, любые советы о том, как обобщить классы, будут оценены, пожалуйста.

+0

Вы можете рассмотреть, чтобы задать этот вопрос по адресу: http://programmers.stackexchange.com/ –

ответ

1

Некоторые замечания, которые, я надеюсь, полезны (но будьте осторожны: следующий код не проверен).

Если ваше Passenger нуждается в имени, фамилии и адресате, я полагаю, что существует конструктор Passenger с тремя строковыми параметрами.

Я полагаю, что ваш Read_from_file() должен стать чем-то вроде

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 
} 

Предложение: параметры Передавать по ссылке, и используя const, когда это возможно.

Аналогично, insert() можно регулировать простым способом (в двух разных режимах, в зависимости от того, используете ли вы в последнее время C++ компилятор или предварительно C++ 11)

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 
} 

Менее очевидно, как check_reservation(). И действительно зависит от вопроса C++ 98/C++ 11.

Я полагаю, что вы хотите check_reservation(), которые хотят найти Passenger давая имя, фамилию и назначения.

В C++ 11 является довольно легко (предположим, что ваш Passenger содержит firsN, а lastN и dest члена)

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);)); 
} 

В 98 не имеют функции лямбда-C++ так сложнее , Вы должны построить функтор для сравнения; что-то вроде

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); } 
}; 

и ваш check_reservation() должен стать чем-то вроде

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)); 
    } 

Повторяю: этот код не тестировался, так что будьте осторожны.

p.s .: извините за мой плохой английский.

Редактировать

К сожалению: если он определен operator== для вашего Passenger, ваш check_reservation() может быть очень легко

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

Благодарности куч! Я еще не тестировал его, но это определенно значительно упростило то, что я должен сделать для остальных функций. Я ценю это! – Brittany

0

Определить class Passenger правильно и все остальное (штраф пассажир дать имя и т.д. и т.п. .) будет намного проще для вас и любого другого, кому повезет, чтобы сохранить его в будущем.

Продумать и реализовать следующие за class Passenger:

destructor 
copy constructor 
copy assignment operator 

Удачи! Если у вас возникли проблемы с кодом C++, отправьте его как отдельный вопрос.

Ссылка: https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)#Rule_of_Three

Смежные вопросы