2

std::string に格納されている値を使用して、同じ名前のクラス インスタンスを呼び出そうとしています。次に例を示します。

class myClass{int x;}

myClass hello;
std::string myString = "hello";

そして、これを行うことによって:

myClass* pleaseWork = myString*;

私はこれを行うことができることを願っています:

std::cout << pleaseWork&.x;

これが実際に可能かどうか、または次のようなキーワードがあるかどうか疑問に思っています

changeToClass(<string>, <classToBeTurnedInto>)

ありがとうございました!

編集

あまり明確にしなかった場合は申し訳ありませんが、私がしようとしているのは、名前が文字列に格納されているクラスを呼び出すことです。したがって、myString に「hello」が含まれている場合、「hello」というクラスを呼び出そうとしています。実際の文字列を使用して。これを実際に使用するには、class1 のクラスを class2 のクラスに渡す必要がありますが、どのクラスを渡すかは、ファイル (char[] または std::string としてのみ読み取ることができます) から読み取って知る必要があります。

これに少し似ていますが、C ++で行う方法がわかりません。

4

3 に答える 3

4

実行時に変数または関数をその名前で取得することは、通常、標準 C++ では不可能です。

ただし、動的リンクおよび動的ロード機能に関心があるかもしれません。

dlopenLinux やその他の Posix システムでは、 と の使用を検討できますdlsymdlopen(3)の man ページをよく読んでください。-ed 名は通常、名前マングリングを避けるためdlsymに宣言する必要があります ....extern "C"

c++ dlopen miniのハウツーを読んでください。

C++11 ではtype_infobad_castdynamic_castRTTI ...についてもお読みください。

リフレクション型のイントロスペクションは便利ですが、C++ ではあまりサポートされていません (Java ではより可能です)。pocoライブラリとQtメタ オブジェクト プロトコルの内部も見てください。

于 2013-10-21T18:27:28.983 に答える
4

文字列をクラスにマップすることは完全に可能です:

std::map<std::string, MyClass*> map;

次に、マップで文字列を調べます。問題は、オブジェクトへのポインターがマップにどのように入るかです。手動でマップを初期化する必要があります。さらに重要なことは、オブジェクトが破棄される前に必ずマップから削除して、オブジェクトの存続期間を確保する必要があることです。

多くの場合、オブジェクトをすべて使用してマップを通過させることができます。このような場合は、

std::map<std::string, MyClass> map;

(ポインターなし): オブジェクトはマップに直接構築され、マップで呼び出すことによって破棄されeraseます。(ある意味で、これは別の種類の動的割り当てです。ただし、ポインターの代わりに文字列を使用してオブジェクトをアドレス指定します。)

于 2013-10-21T18:32:48.690 に答える