この特集のトップページへ
>
Chapter 2:COMアーキテクチャの概要
2.1.2 オブジェクトの生成と破棄
CDictionaryクラスを定義したら,CDictionaryクラスのインスタンス(CDictionaryオブジェクト)を生成してみよう。
オブジェクトの生成には,静的なオブジェクトの生成と動的なオブジェクトの生成という2種類がある。詳しくは後述するが,COM+コンポーネントでは動的なオブジェクトの生成が主となるので,このサンプルでもCDictionaryオブジェクトを動的に生成し,それを活用することにする。
C++でCDictionaryオブジェクトを生成し,そのアドレスをpDictionaryポインタに設定するためには,newキーワードを使用する。
CDictionary *pDictionary = new CDictionary;
CDictionaryオブジェクトの生成に成功すると,pDictionaryポインタにCDictionaryオブジェクトのアドレスが設定される。そのため,pDictionaryポインタを使用し,次のようにして英和辞書を検索するLookupWordメソッドを呼び出すことができる。
if( pDictionary->LookupWord(Eword, Jword) ) printf("%s は %sです。\n",Eword,Jword); else printf("%s は見つかりません。\n",Eword);
辞書検索プログラムの終わりでは,不要になったCDictionaryオブジェクトを破棄するため,deleteキーワードを使用する。deleteキーワードの書式は,deleteのあとに破棄したいオブジェクトを指すpDictionaryポインタを指定するという簡単なものである。
delete pDictionary;
●コンストラクタ
すでに説明したように,プログラムを実行するとnewキーワードによりCDictionaryオブジェクトが生成される。この直後に,暗黙のうちにCDictionaryクラスのコンストラクタが呼び出されている。コンストラクタにオブジェクトの初期化に伴う処理を実装することで,オブジェクトの生成に伴って暗黙裏に初期化処理を実行することができる。コンストラクタは,CDictionaryクラスと同一の関数名であるCDictionary関数として定義すればよい。
サンプルであるCDictionaryクラスでは,英和辞書の単語数を算出し,その結果をメンバ変数であるm_nWordに格納する。実際の処理を確認するため,CDictionaryクラスのコンストラクタを次に示す。この例では,CDictionaryクラスの内部でコンストラクタを定義し,コンストラクタ自体はクラスの外部で実装している。
class CDictionary { ... public: CDictionary(); // コンストラクタ ... }; CDictionary::CDictionary(){ // 英和辞書の個数を算出する。 m_nWord = sizeof(dic)/sizeof(EJ_Dictionary); }
●デストラクタ
コンストラクタがオブジェクトの生成時に暗黙裏に呼び出される関数であるのに対して,オブジェクトを破棄するときに暗黙裏に呼び出される関数がある。この関数は「デストラクタ」と呼ばれ,オブジェクトを破棄する段階で不要になったリソースをクリーンナップする処理を記述するために用いられる。本サンプルでは特別な処理を必要としないため,CDictionaryクラス内部に空のデストラクタを実装する。
class CDictionary { ... public: ~CDictionary(){ } // デストラクタ ... };
以上,コンストラクタとデストラクタについて簡単に説明したが,コンストラクタとデストラクタの動作を理解しておくことは,COMアーキテクチャを理解するために重要なことである。そのため,この機会にプログラムをトレースし,コンストラクタとデストラクタの動作をチェックしておくことをお勧めする。
●サンプルアプリケーションの実装と実行
作成したサンプルアプリケーションのソースコードは,List 2-3のようになる。
作成したソースコードをコンパイルして実行ファイルを生成したら,さっそく英和辞書から「pencil」という単語を検索してみよう。CDictionaryアプリケーションを実行するとFig.2-1のように表示され,英単語が正しく変換されたことがわかる。
Fig.2-1 C++での英和辞書の検索
Chapter 2 3/9 |