「pimpl」のすゝめ

@SubaruG センセが pimpl についてわかりやすくつぶやいていたのでまとめました。C++ ならでは(?)の解説ですね。
9
ドクターねるねるねるね @DrNerunerunerun

pimplイディオムは便利だけどさ、個人的にはインターフェース+ファクトリ関数でいいよねって思う。pimplと継承の相性悪すぎるんだもん

2010-08-18 18:28:05
ドクターねるねるねるね @DrNerunerunerun

ファクトリなら機能追加を見越してバージョン番号を渡すように引き数作っとけばいいし。pimplの方が優れている部分が正直思い浮かばないんだけど何かあるんですか教えてえりゅい人!

2010-08-18 18:31:29
ドクターねるねるねるね @DrNerunerunerun

pimplよりもファクトリの方が便利だと思うんだよな・・・

2010-08-18 18:38:24
普通のC++使い、銀天すばる @SubaruG

@yreeen pimpl は継承を使わないのが強みです。

2010-08-18 18:42:59
普通のC++使い、銀天すばる @SubaruG

pimpl の強みは int と同じように振舞うクラスを書ける点であって、継承を使うなら pimpl に意味はない。

2010-08-18 18:45:50
ドクターねるねるねるね @DrNerunerunerun

@SubaruG 継承に弱いのをデメリットとして見るか、継承させたくないときに使えるとメリットとして見るか…とか考えてます。

2010-08-18 18:46:55
普通のC++使い、銀天すばる @SubaruG

@yreeen 継承に弱いと言っても別に弱くないですよ。要は普通の非 virtual なデストラクタを持ったクラスと同じですから。

2010-08-18 18:48:34
普通のC++使い、銀天すばる @SubaruG

pimpl で作られたクラスは、どのように使ってもいい。 abstract class と継承を使った実装秘匿は、ポインタ経由でしか使えない。この違いは、かなり大きい。

2010-08-18 18:53:58
ドクターねるねるねるね @DrNerunerunerun

@SubaruG 参照じゃ・・・ああ、だめですね・・・

2010-08-18 18:54:52
普通のC++使い、銀天すばる @SubaruG

一番典型的なのはコピーですにゃ。 pimpl なら、しっかりコピーコンストラクタを定義すれば、 C++ の意味論に従ってきちんと動作してくれる。

2010-08-18 18:55:26
普通のC++使い、銀天すばる @SubaruG

pimpl ってのは中身を完璧に隠蔽するのです。その分だけ効率は落ちます。使い道を少し限定して多態による隠蔽を行えば、効率は上がるのは当然。

2010-08-18 18:58:47
ドクターねるねるねるね @DrNerunerunerun

pimpl使ったほうがよさそうな場所を自前のライブラリ群から探してみよう。

2010-08-18 19:04:08
普通のC++使い、銀天すばる @SubaruG

そもそも継承を使わない人間だからなぁ僕は。

2010-08-18 19:05:41
普通のC++使い、銀天すばる @SubaruG

や、継承による多態、と言ったほうがいいか。

2010-08-18 19:06:14
普通のC++使い、銀天すばる @SubaruG

普通にC++書いてて、継承による多態を使わなきゃいけない部分って、どんだけある? っていう話でして。 スタック上やコンテナ上に直接置くんじゃダメなの? 的な。

2010-08-18 19:09:23
普通のC++使い、銀天すばる @SubaruG

多態が必要になったとしても、必要に応じて包含を使って補助クラス書けばいいじゃん。的な。

2010-08-18 19:10:41
普通のC++使い、銀天すばる @SubaruG

pimpl を使った場合は確かに二度手間だけどさ。

2010-08-18 19:11:21
ドクターねるねるねるね @DrNerunerunerun

@SubaruG 複数の中身が異なるデバイスを外部から同じように扱いたいとき がやたら多い私です・・・

2010-08-18 19:12:49
普通のC++使い、銀天すばる @SubaruG

@yreeen 僕はテンプレートで書いてしまうのです。必要に応じて type erasure

2010-08-18 19:13:58
普通のC++使い、銀天すばる @SubaruG

@yreeen 同じものとして扱うならば同じクラスとしてデザインしちゃいますね僕は。

2010-08-18 19:19:38
1 ・・ 4 次へ