我目前有一个航空公司预订数据库的程序,该数据库使用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类。所以是的,任何有关如何概括课程的提示都将不胜感激。
答案 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
包含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:抱歉我的英语不好。
修改强>
抱歉:如果已为您的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