航空公司预订链接列表计划

时间:2016-03-31 08:23:31

标签: c++ object linked-list generalization

我目前有一个航空公司预订数据库的程序,该数据库使用list<string>flight_liststring 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类。所以是的,任何有关如何概括课程的提示都将不胜感激。

2 个答案:

答案 0 :(得分: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包含firsNlastNdest成员

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

在C ++ 98中,你没有lambda函数,所以更棘手。你必须构造一个仿函数进行比较;

之类的东西
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));
}

答案 1 :(得分: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