2017-11-24 5 views
0

pimplイディオムのメインクラスに生ポインタ(parent_)を取り除きたいと思います。それについての最も良い方法は何でしょうか。ここでの例である:C++ 11標準ライブラリのin C++ 11 pimplイディオムの生ポインタを取り除きたい

//==============in "widget.h" 
class Widget { 
public: 
Widget() {}; 
… 
private: 
struct Impl; 
std::unique_ptr<Impl> pImpl; 
}; 

//==== in .cpp 
#include "widget.h" 
#include "gadget.h" 
#include <string> 
#include <vector> 

struct Widget::Impl { 
Widget* parent_; 
std::string name; 
std::vector<double> data; 
Gadget g1, g2, g3; 

Impl (Widget* parent) : parent_ (parent) {} 

}; 

Widget::Widget() 
: pImpl(std::make_unique<Impl>(this)) 
{} 
+0

なぜ参照を使用しないで 'ウィジェット&'と '* this'を渡す? – keith

答えて

3

はないですか!

生ポインタは正常です。生の所有ポインタはスマートなものに置き換える必要がありますが、parent_は何も所有していません。それを残して:)

+0

実際、私はあなたに同意しています。これは私がこのパターンを使用する方法ですが、私が専門家が捕まえる何かを見落としていないことを確認したかっただけです。 – vv1964

+0

'ウィジェット'は 'Impl'の所有者ですが、' Impl'は 'ウィジェット'の所有者ではありません。 shared_ptrを使用していた場合、 'Widget'は' Impl'への強いポインタを持ち、 'Impl'は' Widget'への弱いポインタを持ちます。しかし、この状況では、 'Impl'は'ウィジェット '内に完全に含まれており、漏れていないので、残念です。ここでは、ライフサイクル、所有権、およびオブジェクト管理が強く規定されています。私はクエンティン(そしてあなた自身の本能)に同意します...私はそれを変更しません。 – Eljay

+1

( 'Widget'は適切なコピーコンストラクタを持っていると仮定します、または' = delete'を代入演算子、またはその欠如) – Eljay

2

設計者が不完全型がある場合には、std::unique_ptrstd::shared_ptrに使用されることを可能に非常慎重になっています。

このようなインスタンスは、主にpImplイディオムでこれらのスマートポインタを使用できるようになっています。つまり、裸のポインタは必要ありません。

より多くの詳細に関してはhttp://en.cppreference.com/w/cpp/language/pimpl

+3

OPの意味は、 'std :: unique_ptr 'によって管理されている 'Impl'インスタンスから所有者' Widget'にアクセスしたいのですか?この回答がどのように役立つか分かりません。 – keith

関連する問題