pimpl イディオムを使用していくつかのクラスを実装していますが、いくつかの設計上の問題に遭遇しています。
まず、私はいつもニキビがこのように行われるのを見てきました
class Object
{
public:
Visible();
~Visible();
.. etc ..
private:
class ObjectImpl *_pimpl;
};
私はこのアプローチを使用するいくつかのクラスを持っていますが、私の問題は、これらのクラスのいくつかがお互いの実装の詳細にアクセスする必要があることですが、_pimpl ポインターはプライベートに宣言されています。
_pimpl public を宣言することのマイナス面を誰でも見ることができますか。明らかに、公開されている場合、誰かが誤って (または故意に) 再割り当てする可能性があります。(「プライベート」を「パブリック」として#定義して、とにかくアクセスを許可することができるという事実を無視しています。これを行うと、得られるものに値します)。
私のデザインに欠陥があるかもしれませんが、その点についてのコメントも歓迎します。
Object を完全に定義せずに Object::ObjectImpl を前方宣言することはできないため、友人を使用することは本当に嫌いです。
すなわち
...
private:
class ObjectImpl *_pimpl;
friend class OtherObject::OtherObjectImpl; // this needs a fully qualified OtherObject
};
Thxマーク。
* 更新 - 詳細 **
Command と呼ばれるクラスと Results と呼ばれるクラスの 2 つのクラスがあります。結果のベクトルを返す Command のメソッドがあります。
Command と Results はどちらも pimpl イディオムを使用します。リザルトへのインターフェースをできるだけ小さくしたい。
class Command
{
public:
void getResults( std::vector< Results > & results );
void prepareResults( std::vector< Results > & results );
private:
class CommandImpl *_pimpl;
};
class Results
{
public:
class ResultsImpl;
Results( ResultsImpl * pimpl ) :
_pimpl( impl )
{
}
private
ResultsImpl *_pimpl;
};
Command::getResults() に追加されました。ResultsImpl を結果に挿入します。Command::prepareResults() では、ResultsImpl にアクセスする必要があります。
M.