オーバーロードされた 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 に渡すようなことは可能ですか?