0

オーバーロードされた operator<<() 関数に渡すクラスを決定する際に、この問題を解決する最善の方法について質問があります..

my << 関数は、入力ファイルから行を読み取り、それをトークン化し、その特定の行の最初のトークンに応じて、そのデータを Customer、Tour、または GuidedTour オブジェクトのいずれかに挿入します。

Tour は GuidedTour の基本クラスですが、Customer はまったく関係がないので、それらの間でキャストを使用できるとは思いません (または使用できますか?)

コードは次のとおりです。

 for (unsigned int i = 0; i < inputFiles.size(); i++)
 {
    ifstream fin(inputFiles[i], ios_base::in);
    int line = 0;
    char c;

    while (fin)
    {   line++;
        c = fin.peek();  //use peek() to check first char of next line
        if (c == ios::traits_type::eof())
            break;

        // this is where i am having the trouble
        else if (c == 'C')
            Customer *temp = new Customer();
        else if (c == 'g')
            GuidedTour *temp = new GuidedTour();
        else if (c == 't')
            Tour *temp = new Tour();
        else
            throw boost::bad_lexical_cast();

        try
        {
            fin >> *temp;
        }
        catch(boost::bad_lexical_cast&)
        {
            cerr << "Bad data found at line " << line 
                << " in file "<< inputFile[i] << endl;
        }

        customers.push_back(temp);
    }

    fin.close();
}

私がどこで問題を抱えているかは明らかです。条件付きブロック内のオブジェクトを初期化しているため、そのブロックが終了した後もオブジェクトは持続しませんが、それらを持続させる方法がわかりません..または、私が達成しようとしていることを実行できないだけですか?

これはあまり直接的な質問ではないことを理解しています。私はこの問題を何年も解決しようとしてレンガの壁に頭をぶつけてきたので、アドバイスをいただければ幸いです..

編集: temp と呼ばれるループの開始時に void ポインターを使用し、それを条件内のオブジェクトにキャストしてから fin << *temp に渡すようなことは可能ですか?

4

1 に答える 1

0

@ guskenny83基本的な前提は、voirポインターを宣言し、それに値をプッシュすることです。適切に参照/参照することを忘れないでください。そうしないと、素敵な16進値が出力されます。簡単な例として、変数を使用して型を手動で制御することにより、これを行う次の方法を考えることができます。

#include <iostream>
#include <stdio.h>

enum Type
{
    INT,
    FLOAT,
};
using namespace std;

void Print(void *pValue, Type eType)
{
    using namespace std;
    switch (eType)
    {
        case INT:
            cout << *static_cast<int*>(pValue) << endl;
            break;
        case FLOAT:
            cout << *static_cast<float*>(pValue) << endl;
            break;
    }
}
int main()
{
   cout << "Hello World" << endl; 
   int me = 3;
   void* temp;
   if (me == 2)
   {
       int i = 12;
       temp = &i;
   }
   else 
   {
       float f = 3.2;
       temp = &f;
   }
   if (me == 2)
   {
       Print(temp,INT);
   }
   else
   {
       Print(temp,FLOAT);
   }

   return 0;
}

おそらくvoidポインターではなくクラス階層の再構築を使用して、別の方法を試してみます.

これがお役に立てば幸いです:)

いずれかの方法でフィードバックをお知らせください。折り返しご連絡いたします。

于 2013-10-17T13:08:11.303 に答える