ビルダー パターンを使用したいクラスがありますが、そのクラスは、アクセスする必要のある属性を持つ基本クラスから派生しています。BaseClass
Builder を派生させたとしても、BaseClass
または同様に臭いものから派生させたとしても、公開しないと実装のメンバーにアクセスできません。私のクラス:
BaseClass.h:
class BaseClass
{
protected:
CString name;
}
DerivedClass.h:
class DerivedClass : public BaseClass
{
public:
// builder starts here and has the same base class as the class it is nested in
// (if it doesn't, we can't get access to name)
static class Builder : public BaseClass
{
public:
Builder::Builder(CString pName)
{
this->name = pName;
}
Builder Builder::Description(CString pDescription)
{
this->description = pDescription;
return *this;
}
};
public:
CString description;
};
DerivedClass.cpp:
DerivedClass::DerivedClass(Builder builder)
{
this->name = builder.name; // this is NOT ok
this->description = builder.description; // this is ok
}
私の問題は、アクセスできないことですbuilder.name
。Visual Studio は、「ポインターまたはオブジェクトBaseClass::name
を介して保護されたメンバーにアクセスできない」と言っています。DerivedClass::Builder
のをいじってみましBuilder
たfriend
がBaseClass
、役に立ちませんでした。この投稿でも回避策が提供されていますが、これは Java 用であり、非常に面倒です。
C++ で継承を使用してビルダー パターンを使用する適切な方法はありますか?