私はオブジェクトをストリームで初期化する必要がある(C++)ライブラリを使用しています。ライブラリを備えたサンプルコードは、このコードを使用する:while(!is_eof)の回避
// Declare the input stream
HfstInputStream *in = NULL;
try
{
// This sets up the special stream object for the later object (see below)
in = new HfstInputStream("pathToFile.hfsto");
}
// catch errors...
// {omitted}
// Initialize the object
while (not in->is_eof()) {
if (in->is_bad())
{
std::cerr << "ERROR: Stream cannot be read." << std::endl;
exit(1);
}
// Here we initialize the object using the stream
HfstTransducer t(*in);
}
私の問題は、このオブジェクトが原因スコープのwhileループの外で使用することができないことです。私はそれをストリームで宣言しなければなりません(私が知る限り)。それを宣言してループ内のストリームで初期化することはできません。
私の質問は(1)間違っていますか?どういうわけか実際にループ外に宣言できますか? (2)これを行う別の(より良い)方法は、ループを完全に回避する方法です。たとえば、try/catchを使用して例外をキャッチするとします。
私はC++には新しく、ベストプラクティスを見つけようとしていますので、何が何であるか教えてください。ありがとう。
また、このオブジェクトの永続バージョンを使用するクラスを作成しようとしていますので、それらを使用する必要があるたびにこれらのオブジェクトを常に作成/破棄する必要はありません。
PS:here's a link to the documentation for the object if it is relevant
は編集:私はループの外で変数を宣言しようとし、それを初期化した場合、私はエラー
HfstTransducer t;
while (not in->is_eof()) {
t(*in);
}
// ERROR: main.cpp:47:0 main.cpp:47: error: no match for call to '(hfst::HfstTransducer) (hfst::HfstInputStream&)'
を取得し、私は間違ってそれを初期化しようとしていますか?
'HfstTransducer t(* in);'はループスコープにあります。しかし、 'HfstInputStream * in'はループの外でそれにアクセスして別の' HfstTransducer'オブジェクトを初期化するか 'HfstInputStream'ポインタを使うだけです。もちろん' HfstTransducer'コンストラクタには移動セマンティクスがあり、 HfstInputStream * in'である。 – lapk
ループ外のt(HfstTranducerタイプのオブジェクト)にアクセスできないという問題はありますか? もしそうなら、それをヒープ上のループの外に宣言し、new演算子を使ってループ内で初期化することができます。 それ以外の場合は、私はあなたの問題を誤解しています。P – Lefteris
申し訳ありませんが、私は明確ではない場合。私は、新しいHfstTransducerオブジェクトを毎回構築するのではなく、HfstTransducerオブジェクトをループの外側に保ち、HfstTransducerを初期化した後にストリームを忘れてしまいたいということを意味しました。それが可能であれば、私の目標です。 – dougalg