1

重複の可能性:
クラス名を保持している文字列からオブジェクトをインスタンス化する方法はありますか?

私は、基本クラスInputFileといくつかの派生クラス(、、TxtInputFileなど)を持ついくつかのC ++コードの問題に取り組んでいますASCInputFile。ここで、各派生クラスは特定の入力タイプです。

私ができるようにしたいのは、コマンドラインから変数を削除してから、指定されたファイルタイプを処理するための正しい派生クラスオブジェクトを生成することです(たとえば、ユーザーTXTがコマンドラインから指定されたので、TXTInputFileオブジェクトを生成しますInputFileプログラムの残りの部分で使用するために、ラベルの下に戻ります)。

IF/'ELSE`ステートメントの文字列を使用してこれを行うことができ、ユーザー入力を一連の事前定義されたファイルコードと比較しますが、将来的には、文字列を編集せずに新しいファイルタイプのサポートを追加できるようにしたいと思います。 ifステートメントや新しいファイルコードの追加など。

実行時にすべての派生クラスのコンパイラ生成テーブルにアクセスして基本クラスにアクセスする方法はありますか?

または、渡されたパラメーターが何に等しいかに基づいて動的にバインドされる、ある種のポリモーフィックコンストラクターですか?

(たとえば、 InputFile(string)... TXTInputFile(string temp = "TXT")ASCInputFile(string temp = ASC")...これがパラメータのデフォルト値の形式であり、その一連の思考でどこに向かっているのかを示唆しようとしているだけです。)

前もって感謝します。

4

2 に答える 2

5

std::map文字列からファクトリ関数へのマッピング(おそらくを使用)を作成できます。

于 2012-10-01T02:56:00.960 に答える
0

構文解析がまったく複雑な場合は、独自のパーサーをロールしないでください。古いスタンバイlex/yacc(またはflex / bison)からBoost :: Spirit、ANTLRまで、さまざまなオプションがあります。Lex / yaccはLALRパーサーであり、コードを生成します。生成されたコードは、追跡およびデバッグするのが少し難しいです。Boost :: Spiritは、ANTLRと同様に、最新のプログラミング概念とはるかに一致しています。基本的な考え方は、文法とその文法の処理方法を指定することです。

于 2012-10-01T03:00:19.217 に答える