2009-08-17 12 views
1

私は、オブジェクトの動作やC++での実行時のクラス動作の変更に関して、私の自由時間で解決する小さな問題を受けました。私はちょっと読んで、このリンクを見つけました。本当に役に立ちました。 http://www.vollmann.ch/en/pubs/meta/meta/meta.html Volmann氏は、実行時にクラスを定義するMeta Object Protocol(MOP)を作成しました。メタクラスとC++でのリフレクション

実行時に同じ方法でDLLを動的にロードする方法を追加しようとしましたが、オブジェクトは新しい追加された動作を認識しませんでした。私はXMLファイルのdllのメソッドに関する詳細を保存しました。クラス/オブジェクトに新しいビヘイビアを追加したいときは、xmlファイルを解析して必要なDLLだけをロードしましたが、これは十分柔軟ではありませんでした..

これは単なる学習ケースなので、何か指導を与えてください。私はC++で多くの経験がありませんでしたが、私はその挑戦が好きでした。

ありがとうございます。

+0

可能な解決策として関数ポインタを調べましたか? – suszterpatt

答えて

5

すべてのクラスに対して何らかの種類の基本クラスを作成できます。このクラスは、関数ポインタのためのある種のaddメソッドを持っています。各fpには何らかのハンドルまたは文字列が割り当てられます。後で、ある種の汎用呼び出しメソッドを介して追加された関数を呼び出すことができます。

関数の引数については、クラスのデータを参照する関数にこれを渡す方法が必要です。おそらく、ある種の構造体にデータをカプセル化し、構造体への参照/ポインタを渡します。他の引数については、いくつかのポインタのリストを使うか、bindを見てみることができます。

これはC++がこの種のことを念頭に置いて作成されていないため、これは大きな仕事です。

1

ダイナミックライブラリ読み込みを使用してC++オブジェクトにメソッドを追加することはできません。それはちょうどそのように動作しません。

一般的に、人々はDLLの/ soの中にオブジェクトを格納しています...そしてそれはC++(名前のマングリングのため)の痛みです。あなたが何度も何度も見られるイディオムはextern異なるオブジェクトの範囲を作成するために使用できるファクトリクラスを返す( "dlsym()"などを介して) "C"ブロックを探します。

2

上記のTobias Lの方法は、私が可能な限り見ることができる唯一の解決策です。本当の難しさは、新しいメソッドに引数を渡してバインドする際に現れます。非常に技術的なコードのほとんどが標準的なブーストライブラリ機能を使用することで、ずっと助けてくれました。具体的には、boost :: bindとfunction/functional stuffは、Volmann氏の '属性'の枠組みに沿って「メソッド」を作るために必要なものをたくさん提供しているようです。

関連する問題