【问题标题】:Display and Save Linked List of Objects显示和保存对象的链接列表
【发布时间】:2016-07-22 19:42:00
【问题描述】:

我编写了许多要在对象链接列表上实现的函数。我剩下要写的是display_list()save_to_file() 函数,这对我来说是相当困难的。我目前有如何使用字符串而不是Passenger 对象来完成它的代码,但是我的转换都不起作用。以下只是文件的相关部分。

ma​​in.cc

case 5: 
{
    display_list();
    break;
}

case 6: 
{
    save_to_file("ticket_reservations.dat");
    break;
}

database.h

include<list>
#include<algorithm>
#include<iostream>
#include<string>
#include<fstream>
#ifndef passenger_h
#define passenger_h
 using std::string;
 using std::cin;
 using std::cout;
 using std::list;
 using std::endl;

class Passenger {
public:
    Passenger() {}
    Passenger(string, string, string);
    bool operator==(const Passenger&) const;
    bool operator<(const Passenger&) const;
private:
    string fname, lname, destination;

};

class Flightlist {
public:
    int menu();
    void read_from_file(string);
    void insert(Passenger p);
    void remove(Passenger p);
    bool check_reservation(Passenger p);
    void display_list();
    void save_to_file(string)
private:
    list<Passenger> flist;
};

#endif

database.cc

bool Flightlist::check_reservation(Passenger p)   //example of working function
{
    list<Passenger>::iterator i1, i2;
    i1 = flist.begin();
    i2 = flist.end();
    return flist.end() != find(flist.begin(), flist.end(), p);
}

void display_list()
{
    flist.sort();
    list<Passenger>::iterator i1, i2;
    i1 = flist.begin();
    i2 = flist.end();
    for ( ; i1 != i2; ++i1) {
        cout << *i1 << endl;
    }
}

void save_to_file(string filename)
{
    flist.sort();
    list<Passenger>::iterator i1, i2;
    i1 = flist.begin();
    i2 = flist.end();
    ofstream output(filename.c_str());
    for ( ; i1 != i2; ++i1) {
        output << *i1 << " ";
    }
    output.close();
}

排序应该取自重载的运算符(== 和

任何帮助将不胜感激!

【问题讨论】:

  • 据我所知,您似乎缺少重载的operator &lt;&lt; 来执行流插入。这基本上就是你遇到的问题吗?对于运算符重载问题,我将您推荐给this question and its answers,您可能会发现非常很有帮助。具体来说,在出色的选择答案中查找“Bitshift Operators (used for Stream I/O)”。

标签: c++ linked-list iterator


【解决方案1】:
bool Flightlist::check_reservation(Passenger p);

check_reservation函数的参数应该通过引用传递,或者应该实现Passenger类的assgin函数,里面没有。

bool Flightlist::check_reservation(Passenger & p);

或:

class Passenger {
public:
    Passenger() {}
    Passenger(string, string, string);
    Passenger(const Passenger&);
    void operator=(const Passenger&) const;
    bool operator==(const Passenger&) const;

    bool operator<(const Passenger&) const;
private:
    string fname, lname, destination;

};

【讨论】:

  • check_reservation 函数实际上是唯一在那里工作的函数?
  • @Brittany 否则就实现Pasenger的对象赋值功能
  • 我不明白你的意思?对于 display_list 和 save_to_file 类?
  • @lulyon check_reservation 不修改参数,搜索将调用operator ==。除了效率之外,没有理由将该参数作为引用(理想情况下应该是const),也不需要重载默认赋值运算符,它将按原样深度复制这个类。 (而且 都不 无论如何都不会解决 OP 的问题)。最后,在哪个星球上(不必要的)重载 assignment 运算符 const
  • @Brittany 我敦促您检查我在一般评论中提供的链接。它涵盖了有关运算符重载的各种主题,包括我认为您似乎需要的内容:重载流插入,std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, const Passenger&amp;)
猜你喜欢
  • 2018-10-20
  • 2020-06-12
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多