0

(ほとんどの場合、 2 つの問題を分離するために、別のクラス テンプレートから変数にアクセスすることから貼り付けられます)

テキスト ファイルからデータをロードするためにデータ ローダー クラスで使用できるコンテナー クラスのシステムを作成しようとしています。

2 つのクラスのデータを次に示します。

class Customer
{
    //...
};

class Tour
{
    std::vector<Customer*> custPtrs;
    //...
};

これらは私の2つのコンテナクラスです:

template <class T>
class P_VContainer
{
    boost::ptr_vector<T> data;
    //...
};

template <class T>
class ListContainer
{
    std::list<T> data;
    //...
};

そして最後に私のデータローダーテンプレート:

template<template<class> class T>
class DataLoader
{
    T<Customer> custList;
    T<Tour> tourList;

    //...
};

Customer と Tour で >> 演算子をオーバーロードして、ifstream を渡すことができるようにしました。ストリームから行が取得され、トークン化され、オブジェクト インスタンス変数に入れられます。

コンテナー クラスは挿入を順番に処理し、データ ローダーはリストを管理し、オブジェクトに渡せるように ifstream を作成します。

これは私の問題です:

最初に顧客ファイルをロードし、そのリストにデータを入力しています。

その後、予約した顧客の顧客 ID を持つツアーを読み込む必要があります。顧客情報に簡単にアクセスできるように、それらの顧客を各ツアー オブジェクトのポインターのベクトルに格納したいと考えています。

現時点では、customerID を文字列のリストとして保存しています。ツアーがすべて読み込まれると、custList を検索する関数に custList を渡し、文字列のリストと一致させます。

これは、文字列の 1 つと他のポインターの 2 つのリストを維持し、基本的にすべてのデータを二重に処理する必要があることを意味します。

オーバーロードされた Tour の >> 演算子内から custList インスタンス変数にアクセスし、Tour オブジェクトを作成するときにポインタのリストを生成する方法があるかどうか疑問に思っていました。

技術的にはすべてが DataLoader クラスのスコープ内で発生しているので、可能だと思いますが、どうすればよいかわかりません..多分それをフレンドクラスにしますか? 私はそれをやろうとしましたが、これまでのところ運がありません..

どんな助けでも大歓迎です.長い説明で申し訳ありません.うまくいけばそれは理にかなっています..

4

1 に答える 1

1

最終的なストリームの使用法は次のようになります。

custStream >> customers >> toursStream >> tours;

これを実現するには、顧客用とツアー用の 2 つのストリームで ifstream をラップし、顧客リストをストリームに保持する必要があります。コードは次のとおりです。コンテナーをお気に入りに置き換えることができます。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

class CustomersInFileStream {
public:
    std::vector<Customer> customers;
    std::ifstream &input;
    CustomersInFileStream(std::ifstream &fileIn)
        :input(fileIn){
    }
};

class ToursInFileStream {
public:
    std::vector<Customer> customers;
    std::ifstream &input;
    ToursInFileStream(std::ifstream &fileIn)
        :input(fileIn){
    }
};

CustomersInFileStream &operator>>(CustomersInFileStream &input, std::vector<Customer> customers) {
    // perform file parsing here using ifstream member
    input.customers = customers;
    return input;
}

ToursInFileStream &operator>>(CustomersInFileStream &customersStream,
                                  ToursInFileStream &toursStream) {
    toursStream.customers = customersStream.customers;
    return toursStream;
}

ToursInFileStream &operator>>(ToursInFileStream &input, std::vector<Tour> tours) {
    // perform file parsing here using ifstream member
    // you also do have customers list here
    return input;
}

int main()
{

    std::ifstream customersFile("~/customers.txt");
    std::ifstream toursFile("~/tours.txt");

    CustomersInFileStream custStream(customersFile);
    ToursInFileStream toursStream(toursFile);

    std::vector<Customer> customers;
    std::vector<Tour> tours;

    custStream >> customers >> toursStream >> tours;

    return 0;
}
于 2013-10-19T22:01:29.293 に答える