プラグイン・プログラミング(8)
2007年2月1日………大学は春休みに突入で、当講座も終盤に突入である(・∀・)
★クラスを取り扱ってみる
さて、前回までは構造体(POD型とPOD型+α)を取り扱った。
今回は、クラスを取り扱うことにしよう………と書いたが、これまでのことさえ理解出来ていればすぐにクラスは取り扱える。
何故ならば、クラスと構造体はほぼ同一であるからだ(一応、デフォルトのアクセス制限がprivateかpublicかという違いはあるが)
では、具体的に後は何を学習すればクラスを取り扱えるのだろうか? 答えは、コンストラクタとデストラクタと演算子オーバーロードである。
とはいえ、これまでの講座を読んできた者には分かるだろう………コンストラクタもデストラクタも演算子オーバーロードも、外部に展開される。
#include <stdio.h> #include <string.h> struct Test_POD{ int nMem; char strMem[20]; }; struct Test_Class{ int nMem; char strMem[20]; Test_Class(){ Clear(); } ~Test_Class(){ Clear(); } void Clear(){ nMem = 0; strcpy(strMem, ""); } const int operator =(const int n){ nMem = n; return(n); } const char* operator =(const char* s){ strcpy(strMem, s); return(s); } }; int main(){ printf("Test_POD:%d\n", sizeof(Test_POD)); printf("Test_Class:%d\n", sizeof(Test_Class)); return(getchar()); }
上記のプログラムを実行すると、Test_PODもTest_Classも同じ24バイトであると表示される。
コンストラクタもデストラクタも演算子オーバーロードもクラスや構造体に対する共通のオペレーションである以上、外部に出すのが最も効率的なのである。
以上で終了、いかがでしたか僕らの講座〜♪………って、早っ!?(゜Д゜) ………ま、まあこんなに早く終わるのもアレだし幾つかの注意事項を記しておこう(;´Д`)
★fastcall禁止令
以前にも述べた呼び出し規約に関してのことである、これはクラスや構造体に限った話ではないがfastcallは決して使用してはいけない。
何故ならば、Wikipediaにもあるとおりfastcallの実装はコンパイラ依存であるからである。呼び出し規約は、必ずcdeclかstdcallを使用すること。
★thiscall禁止令
また、thiscallもコンパイラ依存である。ただ、thiscallは(Windows系コンパイラ:BCCやVCなら)共通の実装であるのでfastcallほど厳しく捉える必要も無い。
というか、BCCとVCのみでの実装を考えるのなら禁止する必要はない。とはいえ、GCCなどのことも考えるのなら全てのメンバ関数はcdeclを使用した方が良いだろう。
★仮想デストラクタ禁止令
………という噂があるが、真偽は知らない(;´Д`) だが各所で言われていることなので、一応掲載はしておこう。
仮想デストラクタをクラスに持たせると、メモリ配置が変わってしまうことがあるようで………故に、仮想デストラクタを持たせてはならないと(´Д`)
ただ、「仮想」デストラクタなので普通のデストラクタは大丈夫っぽい。構造体的に手軽に受け渡しする為のクラスなら、気にする必要はないだろう。
………つまり、プラグイン・プログラミング(4)のソースコードは間違いである(;´Д`)
仮想デストラクタは持たせず、delete前にvoid Finalize()のような後始末の関数を呼ばせるかvoid
Suicide()のような自殺関数を呼ばせなければならない。
まあ、プラグインを作成するということに限定して話を進めると、
DLLで確保してEXEで解放:EXE側の「管理者」(あるいは「保持者」)に呼ばせる
EXEで確保してDLLで解放:ほぼありえない
と考えられるので、そう難儀だと考える必要もない。ただ、仮想デストラクタを持たせると動作が不定になってしまうというのは肝に銘じること(ついついやっちゃいそうだしな)
以上、これで(8)は終了である。次回は、今までだらだらと書いていたことを全て総括する(見易くすると言った方が良いだろうか?)
次回で今度こそプラグイン・プログラミングは終了だと思われる。プラグイン作成時における必要事項は、既に全て記してしまったからだ。
俺も勉強しながら当講座を書いているので、当講座の正しさは保証できない。だが、プラグインのシステムを作ろうとする者に役立てば今まで書いてきた甲斐があるというものである。