У меня есть класс, на котором я хотел бы использовать шаблон построителя, но он получен из базового класса, атрибуты которого мне нужно получить. Я не могу получить доступ к членам BaseClass
в моей реализации, не делая их общедоступными, даже если я получаю Builder от BaseClass
или что-то столь же вонючее. Мои классы:C++ Builder Pattern with Inheritance
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
a friend
из BaseClass
, но безрезультатно. Этот post также предоставил обходной путь, но он для Java и очень грязный.
Есть ли достойный способ использования шаблона-строителя с наследованием на C++?
Это похоже на то, что я искал, спасибо! – aguazales
Правила доступа были обновлены на C++ 11. Вложенный класс теперь имеет доступ ко всем именам, к которым может обращаться доступный класс (см. [This] (http://en.cppreference.com/w/cpp/language/nested_types)). – Excambion