「More C++ Idioms/名前付きコンストラクタ(Named Constructor)」の版間の差分
削除された内容 追加された内容
Electric goat (トーク | 投稿記録) M en:More C++ Idioms/Named Constructor の 4版: oldid=1290932 |
現内容を翻訳 |
||
1 行
=<center>名前付きコンストラクタ(Named Constructor)</center>=
===
* クラスのオブジェクトを生成する可読性が高く直感的な方法を提供する。
* クラスのオブジェクトを生成する際に特定の制約を強制する。
===
===
C++ では、コンストラクタはパラメータの型、順序、数によってのみ互いに区別される。もちろん、クラスが複数のコンストラクタを持つ時、それぞれのコンストラクタは異なる目的を持っている。しかし、C++ ではクラスのインタフェースに対して ''意味的な'' 違いを表現することは困難である。なぜなら全てのコンストラクタは同じ名前を持ちパラメータによってのみ区別されうるからである。パラメータの型、順序、数のみが異なる多数のコンストラクタ呼び出しを伴うコードを読むことは、クラスのオリジナルな作者以外には非常に非直感的なものとなる。名前付きコンストラクタ(Named Constructor)イディオムはこの問題に対処する。
===
名前付きコンストラクタ(Named Constructor)イディオムは、コンストラクタの代わりにオブジェクトを生成する意味のある名前を持った一組の静的メンバ関数を利用する。コンストラクタは private か protected でクライアントは public な静的関数のみにアクセスできる。その静的関数群は ''名前付きコンストラクタ(named constructor)'' と呼ばれ、オブジェクトを生成するそれぞれ独自の方法と、それぞれ異なった直感的な名前を持つ。以下の例を考えてみよう。
<source lang="cpp">
16 行
{
public:
static Game createSinglePlayerGame() { return Game(0); } //
static Game createMultiPlayerGame() { return Game(1); } //
protected:
Game (int game_type);
23 行
int main(void)
{
Game g1 = Game::createSinglePlayerGame(); //
Game g2 = Game(1); //
}
</source>
上記クラスにおいて名前付きコンストラクタ(Named Constructor)イディオムなしの場合、''Game(1)'' と ''Game(0)'' が何を意味するのか把握することは難しい。このイディオムはその意図をはっきり明確にする。さらに、このイディオムによりオブジェクトの生成プロセスに特定の制約を課することができる。例えば、名前付きコンストラクタが常に ''new'' を使って動的にオブジェクトを作成するようにできる。そのような場合、[[More C++ Idioms/リソースの返値(Resource Return)|リソースの返値(Resource Return)]]イディオムも有用となるだろう。
===
===
[[More C++ Idioms/リソースの返値(Resource Return)|リソースの返値(Resource Return)]]
=== References ===
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.8
<noinclude>
[[Category:{{BASEPAGENAME}}|{{SUBPAGENAME}}]]▼
[[en:More C++ Idioms/Named Constructor]]
</noinclude>
|