「More C++ Idioms/具象データ型(Concrete Data Type)」の版間の差分
削除された内容 追加された内容
M en:More C++ Idioms/Concrete Data Type の 4版: WB:RFI oldid=56963 |
現内容を日本語に翻訳 |
||
1 行
=<center>具象データ型(Concrete Data Type)</center>=
===
フリーストア(ヒープ)を用いた動的な割り当てを許可あるいは禁止する事でオブジェクトのスコープと生存期間を制御する。
===
===
C++ にはオブジェクトの生存期間の制御とプログラムレベルでの識別子(変数)への束縛に対して 2 つの方法がある。1 つ目は、スコープ変数とオブジェクトであり、スコープが終了した後速やかに破棄される(''例えば'' 関数スコープの整数変数等)。2 つ目は、スコープ変数(しばしばポインタ)とフリーストアに動的に割り当てられたオブジェクトである。この場合、変数のスコープが終了した際に変数自体は存在しなくなるがオブジェクトの生存期間は継続する(''例えば'' シングルトンやウィンドウオブジェクト等)。 具象データ型(Concrete Data Type)イディオムを用いる事で、生存期間に対する上記 2 つの選択のいずれかを強制する事が出来る。
===
このイディオムは、目的を達成する為に単純にクラスレベルのアクセス指定子(private, protected)を使う。以下のコードは MouseEventHandler クラスに動的な割り当てを強制する方法を示す。
<source lang="cpp">
16 ⟶ 15行目:
virtual ~EventHandler () {}
};
class MouseEventHandler : public EventHandler //
{
protected:
~MouseEventHandler () {} //
public:
MouseEventHandler () {} //
};
int main (void)
{
MouseEventHandler m; //
EventHandler *e = new MouseEventHandler (); //
delete e; //
}
</source>
動的な割り当てを強制する別の方法として、コンストラクタへの直接のアクセスをさせず代わりに動的に割り当てられたオブジェクトを返す静的関数 instance() を提供する方法がある。これはシングルトンデザインパターンとよく似ている。さらに言えば、メモリを解放するのに多態的な delete は必ずしも必要ではない。メンバ関数 destroy() によって仮想関数テーブルポインタに必要な領域を節約した上で目的を達成する事が出来る。
<source lang="cpp">
class MouseEventHandler //
{
protected:
MouseEventHandler () {} //
~MouseEventHandler () {} //
public:
static MouseEventHandler * instance () { return new MouseEventHandler(); }
void destroy () { delete this; } //
};
</source>
このイディオムの対極に当たるのがスコープ変数(自動変数)の強制である。これは private な new 演算子を用いる事で実現できる。
<source lang="cpp">
50 ⟶ 49行目:
{
private:
static void * operator new (unsigned int size); //
static void * operator new (unsigned int size, void * mem); //
};
int main (void)
{
ScopedLock s; //
ScopedLock * sl = new ScopedLock (); //
void * buf = ::operator new (sizeof (ScopedLock));
ScopedLock * s2 = new(buf) ScopedLock; //
}
</source>
ScopedLock オブジェクトは標準的な new 演算子、nothrow な new、配置形式(placement) new のいずれによっても動的に割り当てる事が出来ない。
===
===
=== References ===
* [http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#ConcreteDataType Concrete Data Type] - J. Coplien.
<noinclude>
[[Category:{{BASEPAGENAME}}|{{SUBPAGENAME}}]]▼
[[en:More C++ Idioms/Concrete Data Type]]
</noinclude>
|