2

list<string>flight_list私は現在、 and 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 クラスで作業しています。ええ、クラスを一般化する方法に関するヒントをいただければ幸いです。

4

2 に答える 2

1

役立つと思われるいくつかの観察 (ただし、注意してください: 次のコードはテストされていません)。

Passenger名、姓、宛先が必要な場合は、 Passenger3 つの文字列パラメーターを持つコンストラクターがあると思います。

私はあなたがの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 以前を使用しているかに応じて、2 つの異なるモードで)

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 ではかなり簡単です ( 、 a 、およびメンバーPassengerが含まれていると仮定します)firsNlastNdest

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 では、ラムダ関数がないため、よりトリッキーです。比較のためにファンクターを作成する必要があります。何かのようなもの

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==は本当に簡単になりますPassengercheck_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 に答える