1

基本クラスがある場合:

class Base 
{
public:
virtual void Test()=0;
};

そして、動的にロードされたモジュール(.so / .dll)で、これから派生したクラスを実装しました。

class SomethingFromBase : Base 
{
...
};

そして、ユーザーは、このライブラリがロードされると、のインスタンスを作成するように要求しますSomethingFromBase(たとえば、cinから名前を取得します)。そして、私たちには知識がありませんSomethingFromBase(つまり、if(inputstr == "SomethingFrombase") { ... } 作成する方法はありません。 SomethingFromBaseのインスタンス?

これは(標準の)C ++では不可能だとかなり確信していますが、SOが私を驚かせることを常に望んでいます!

ライブラリを追加することでこれが可能であれば、それについて知りたいと思います。ありがとう!

編集: cdhowieの答えを参照してください。この手法を実装するためのガイド: http ://www.linuxjournal.com/article/3687?page = 0,1 http://www.abstraction.net/ViewArticle.aspx?articleID=67

4

2 に答える 2

5

通常、これを実現するには、プラグインライブラリで、呼び出すことができるさまざまな関数へのポインタを含む構造体タイプのグローバル変数を定義する必要があります。(セットアップ、ティアダウンなどのように)セットアップ関数の間に、クラスの名前を表す文字列と、を作成するファクトリ関数ポインターを渡すことができるいくつかの「レジスタ」関数をアプリケーションに呼び出します。実行時のインスタンス。

これをマップに隠しておき、ユーザーが文字列を入力すると、マップを見て、ファクトリ関数が登録されているかどうかを確認します。もしそうなら、それを呼んでください。

したがって、これは「真の」反映ではありませんが、ある程度手動でハックすることができます。たとえば、プロトコルリストに多くのエントリを提供する可能性のあるプロトコルプラグインを指定できるPidginを参照してください。

編集: これは、似たようなものを実装するための気の利いたガイドです。私はCの人なので、本当に素晴らしいとは言えませんが、一見良さそうです。Linux上のCでも同様のことを行いましたが、基本的なアプローチは非常にうまく機能します。

于 2010-11-20T04:25:27.130 に答える
0

クラス名でキー設定されたクラスのオブジェクトをマップに保存します。この方法で作成する必要のあるすべてのクラスは、「Creatable」のような名前の基本クラスから派生する必要があります。クラスのオブジェクトを追加するコードは、クラスの実装で指定する必要があります。

//Creatable.h
#define IMPLEMENT_CREATABLE( ClassName ) \
  ObjectMap::Instance().Add( string(ClassName), new ClassName );

//ObjectMap.h. This is a singleton
class ObjectMap
{
  ...........
  map<string, Creatable *> myMap;
  ...........
public:
  void Add( const string &className, Creatable * );
  Creatable * Get( const string &className );
};

//My Class.h
class MyClass : public Creatable
{
  ................
};

//My Class.cpp
IMPLEMENT_CREATABLE(MyClass);


//Client.cpp
string className;
cin>>className;
Creatable *anObject = ObjectMap::Instance().Get( className );
于 2010-11-20T05:23:16.097 に答える