継承はインタフェースの再利用で、pimplはインタフェースと実装の分離だからある意味しょーがない気もする。二重に継承階層を管理しないといけないのは避けようが無い RT @SubaruG: っていうか、今思ったけど、継承とpimplって物凄く相性悪いよね。 Pimpl側の実装関数に
2010-04-04 23:41:44boost::scoped_ptr に格納されるポインタは、boost::scoped_ptr が「インスタンス化されたときに」incompleteな場合、コンパイルエラーになります。
2010-04-04 23:44:36pimplの場合、コンストラクタは全て実装側の定義なので、その時点ではscoped_ptrに格納されるクラスは完全型だから問題無し。
2010-04-04 23:45:35ただ、デストラクタの宣言を忘れると、コンパイラによって自動定義されたデストラクタが、ヘッダ部分に生成されて、その時点ではincomplete だから、コンパイルエラーになる。
2010-04-04 23:46:34へ~。そういう原理だったのか RT @SubaruG: ただ、デストラクタの宣言を忘れると、コンパイラによって自動定義されたデストラクタが、ヘッダ部分に生成されて、その時点ではincomplete だから、コンパイルエラーになる。
2010-04-04 23:47:37shared_ptr の削除子は実行時解決されるので、その辺は問題ないんだけど…正直、実行時に解決されるのはコスト的にどうなの、と。
2010-04-04 23:48:49しかもshared_ptrはnoncopyableじゃないから、コピーコンストラクタと代入演算子を明示的に殺さないとひどい目にあうし。
2010-04-04 23:49:23でもunique_ptrじゃないとreleaseできない... RT @SubaruG: というわけで僕はscoped_ptr推進派です。shared_ptrも悪くないけど。生ポインタだけは勘弁。
2010-04-04 23:53:10pimpl使っている以上、どっかでインスタンスを破棄しなきゃいけないのは変わらないのです。デストラクタを自前で用意しなきゃいけない面倒さを嫌う人は shared_ptr を使えばいいし、実行時パフォーマンスを気にするならscoped_ptrを使えばいい。好みの問題。
2010-04-04 23:53:26あ、pimplのはなしかorz RT @hotwatermorning: でもunique_ptrじゃないとreleaseできない... RT @SubaruG: というわけで僕はscoped_ptr推進派です。shared_ptrも悪くないけど。生ポインタだけは勘弁。
2010-04-04 23:54:29@SubaruG 逆に言えば、参照カウントによる共有のセマンティクスが自動的に実現されるのが利点となる場合もあると言えると思います。
2010-04-04 23:54:31@egtra immutableな場合はそれでいいんですけど、mutableな場合は誤解のもとになりますからねー。
2010-04-04 23:56:06ってそれ、 std::unique_ptr<T, std::funtion<void(T*)>>とどう違うの、ってね。
2010-04-04 23:58:38