2

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

4

2 回答 2

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包含 a firsN、 alastN和 adest成员)

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

我再说一遍:这段代码未经测试,所以要小心。

ps:对不起我的英语不好。

编辑

对不起:如果它是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));
}
于 2016-03-31T12:14:57.507 回答
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

于 2016-03-31T12:24:04.540 回答