![]() |
[2009 年 8 月号] |
[技術講座]
Downloaderの例では、Downloaderの操作downloadがDownloadObjectのポインタを受ける形になっていました。もし、これがshaerd_ptrにできたら、問題は解決するのでしょうか?より一般的に、以下のモデルで考えてみましょう。
クラスBaseHolderが、クラスBaseの集合をshared_ptr<Base>として持つという構造です。クライアントはクラスDerivedを生成し、それをshared_ptr<Drived>にて保持し、BaseHolderのaddElementに渡します。shared_ptrは継承関係を考慮した受け渡しがサポートされているため、shared_ptr<Drived>をshared_ptr<Base>に渡すと、通常のポインタを渡したように、以降、shared_ptr<Base>経由で、クラスDerivedのメンバ関数をポリモーフィックに呼び出すことができるようになります。
と、ここまでは良いのですが、これからが問題です。クラスBaseHodlerがshared_ptr<Base>経由で、メンバ関数method()を呼び出すと、期待通りクラスDerivedのmethod()が呼び出されます。しかし、この中でアクセスできるthisポインタは、Derivedの通常のポインタであり、Derivedのshared_ptrではありません。よって、クラスDerivedの操作内部から、自身をいずれかのクラスと共有したい場合は、shared_ptrを作り出す仕組みを準備しておく必要があるのです。
© 2009 OGIS-RI Co., Ltd. |
|