带有继承的C++Builder模式
C++ Builder Pattern with Inheritance
我有一个类想要使用构建器模式,但它是从一个基类派生的,我需要访问该基类的属性。在我的实现中,如果不公开BaseClass
的成员,我就无法访问它们,即使我从BaseClass
或类似的东西派生Builder也是如此。我的课程:
基本类.h:
class BaseClass
{
protected:
CString name;
}
衍生类.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
变成BaseClass
的friend
,但没有成功。这篇文章也提供了一个变通方法,但它是针对Java的,而且非常混乱。
在C++中,有没有一种体面的方法可以使用带有继承的构建器模式
尽管Builder
是在DerivedClass
内部声明的,但Builder
并不像您所期望的那样与DerivedClass
隐式地成为朋友。Builder
仍然是它自己的类,并且它遵循与任何其他类相同的规则,包括作用域访问规则。这就是DerivedClass
默认情况下不能访问Builder
的protected
成员的原因。你需要明确地宣布这种友谊。
此外,由于Builder
没有description
成员,您的Builder::Description()
方法将无法按原样工作。Builder
方法内部的this
指针仍然指向Builder
实例,而不是DerivedClass
实例。如果希望Builder
访问DerivedClass
的成员,则需要为其提供一个指向DerivedClass
实例的指针。否则,给Builder
它自己的description
成员(看起来你无论如何都在尝试这样做)。
试试这个:
基本类.h:
class BaseClass
{
protected:
CString name;
};
衍生类.h:
class DerivedClass : public BaseClass
{
public:
class Builder : public BaseClass
{
public:
Builder(const CString &pName)
{
this->name = pName;
}
Builder& Description(const CString &pDescription)
{
this->description = pDescription;
return *this;
}
public:
CString description; // <-- add this
friend class DerivedClass; // <-- add this
};
public:
DerivedClass(const Builder &builder);
public:
CString description;
};
DerivedClass.cpp:
DerivedClass::DerivedClass(const DerivedClass::Builder &builder)
{
this->name = builder.name; // this is ok now
this->description = builder.description; // this is ok now
}
不要试图直接访问成员。使用公共访问器方法。
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- TDateTime格式在C++Builder中不会更改
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- C++Builder中的OnClick事件签名存在问题
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 小字符串优化(调试与发布模式)
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 在C++的一系列数字中查找重复模式
- 带有正向声明的C++Builder模式
- 带有继承的C++Builder模式