我目前有一个使用 list<string>flight_list
的航空公司预订数据库程序和 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 类。是的,如果有任何关于如何概括类的提示,我们将不胜感激。
最佳答案
我希望有帮助的一些观察(但要小心:以下代码未经测试)。
如果您的 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);));
}
在 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.:抱歉我的英语不好。
编辑
抱歉:如果它为您的 Passenger
定义了 operator==
,您的 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));
}
关于c++ - 航空公司预订链表程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327913/