おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

dynamic_cast を何とかせねば。

えと、昨日の記事の追記はもうしばらくお待ちください。

DLLの中にクラスを入れる方法の続きです。この前の記事ですが、まとめのうち一つ訂正。
1. DLL の中にエクスポートしたいクラスの基底となるインターフェースクラスを用意する。呼び出し側からインスタンスを破棄するためのメソッドを持たせる。←これはOK!
2. DLL 側のクラスをインスタンス化するために、Creatorを用意する。Factory デザインパターンを用いるとなお良い。←これもOK!
3. DLL の呼び出し側(メイン側)では、クラスのポインタとして、スマートポインタを使えばクラスの解放忘れがなくなって良さげ。破棄関数を指定できる boost::shared_ptr を使うのが妥当と思われる。←これはNG!

正解は→ 3. スマートポインタとして侵入型参照カウント方式を用いる。boost::intrusive_ptr が使える。
DLL 間の呼び出しでテンプレートの型をやり取りするのはまずいので、その部分はオブジェクトの生のポインタをやり取りすることになると思います。そうなると、その状況でも DLL 側、メイン側でちゃんと動くスマートポインタとなると侵入型になっちゃうと思うんだよね。要は、DLL 間を行き来するときは生ポインタだけど、それ以外のときは boost::intrusive_ptr でラップしてポインタを使おうってわけ。

実は、昨日の Factory パターンも関係があって、この Factory を使って DLL の中にいるクラスをインスタンス化してます。まあ、とりあえず DLL の中にクラスを入れることはできたんだけど、一つ問題が発生。

よく考えたら、dynamic_cast もコンパイラ依存ジャン!! RTTI の実装はコンパイラ依存だからねぇ(よく考えなくても分かるかもしれないけど)。現状だと、とりあえずの動作確認に DLL 側もメイン側も VisualC++ 使ってるんで動いてるんだけど、メイン側を C++Builder にしたら動かなくなるだろうなと。そこで、思い出したのが COM の QueryInterface() 。なるほどな~。コンパイラ非依存で、クロスキャストを安全に行うにはこれしかないか。と、ちょっと COM の仕組みに納得しました。さ~て、んじゃ私も QueryInterface を実装しますか。

なんだか、まとめの項目1のの基底となるインターフェースってやつに、侵入型参照カウントの実装してる時点で、AddRef()、Release() ってメンバがいるんだが…ここでさらにQueryInterface() とくると…何やってるんだろうな。ホントに自分で COM 作ってる気がしてきますた。

この辺の話も、後ほど詳しくまとめたいと思うので、ちょっとお待ちください。
  1. 2006/10/21(土) 20:02:10|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<あ゛、この前のバグ発見。 | ホーム | Factory パターンの復習 と テンプレート>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/153-f0f3fa7b
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。