【问题标题】:Airline Reservation Linked List Program航空公司预订链接列表程序
【发布时间】:2016-07-19 13:59:24
【问题描述】:

我目前有一个使用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 类。所以是的,任何关于如何概括类的提示都将不胜感激。

【问题讨论】:

标签: c++ object linked-list generalization


【解决方案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));
    }

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

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

编辑

抱歉:如果为您的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));
}

【讨论】:

  • 非常感谢!我还没有对其进行测试,但这无疑使我对其余功能也必须做的事情更加清楚。我很感激!
【解决方案2】:

正确定义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

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2017-10-13
    相关资源
    最近更新 更多