如何从其抽象母亲 class 上的指针初始化 child class?
How to initialize a child class from a pointer on its abstract mother class?
所以我是 C++ 的新手,我的问题是这个:
我有一个摘要 class,它有多个 child classes(他们也有其他 child classes)。我正在尝试使用多态性来序列化和反序列化这些 child classes,并且在我的摘要中有 class:
virtual QDataStream& serialize(QDataStream& stream)=0;
virtual QDataStream& deserialize(QDataStream &stream)=0;
所以我的问题很简单:当我反序列化时,我想调用反序列化函数,但我还不知道我正在检索哪个child class。
函数是这样的:
QDataStream& operator>>(QDataStream& in, SomeClass& i){
std::shared_ptr<AbstractClass> ptr;
ptr->deserialize(in); //Raises an SIGSEGV error
}
我不知道我是否完全清楚,但基本上我想做的是实例化并调用流对应的 child class ,并调用反序列化在上面。可能吗?
谢谢!
编辑:我第一个可行的方法是还向 QDataStream 提供我的 child class 名称,这样我就知道要实例化哪个 class:
QString myClassName;
in >> myClassName;
if(myClassName == "ChildClass1"){
std::unique_ptr<AbstractClass> ptr(new ChildClass1);
ptr->deserialize(in);
}
但我觉得这真的不是一个干净的OOP方式!
std::shared_ptr<AbstractClass> ptr;
默认初始化的共享指针指向空值。
通过空指针间接访问的行为未定义。
ptr->deserialize(in); //Raises an SIGSEGV error
这通过一个空指针间接进行。程序的行为未定义。
您可以通过摆脱动态分配来简化您的工作示例:
ChildClass1 c;
c.deserialize(in);
在这种情况下您不需要多态性。
what I'm trying to do is to instantiate and call whichever child class [determined at runtime]
您在这里尝试实现的实质上是 工厂方法 模式。在静态类型的 non-reflective 语言(如 C++)中没有简单的方法以通用方式实现工厂方法。您会发现大多数示例都使用简单的 if-else 结构,例如您自己建议的结构。
您可以看到一些在另一个 post 上创建通用工厂方法的尝试,这个答案似乎特别合适:。但正如我所说;不简单。
不幸的是,无法仅从基础 class 初始化 child class。序列化时,您必须为 child class 序列化某种 id。接下来,在反序列化时,我建议您使用 factory 模式。使用工厂,您可以传递要反序列化的 id 和 class 数据。该工厂函数将构建所需的 child class 和 return 指向基 class.
的指针
所以我是 C++ 的新手,我的问题是这个: 我有一个摘要 class,它有多个 child classes(他们也有其他 child classes)。我正在尝试使用多态性来序列化和反序列化这些 child classes,并且在我的摘要中有 class:
virtual QDataStream& serialize(QDataStream& stream)=0;
virtual QDataStream& deserialize(QDataStream &stream)=0;
所以我的问题很简单:当我反序列化时,我想调用反序列化函数,但我还不知道我正在检索哪个child class。
函数是这样的:
QDataStream& operator>>(QDataStream& in, SomeClass& i){
std::shared_ptr<AbstractClass> ptr;
ptr->deserialize(in); //Raises an SIGSEGV error
}
我不知道我是否完全清楚,但基本上我想做的是实例化并调用流对应的 child class ,并调用反序列化在上面。可能吗?
谢谢!
编辑:我第一个可行的方法是还向 QDataStream 提供我的 child class 名称,这样我就知道要实例化哪个 class:
QString myClassName;
in >> myClassName;
if(myClassName == "ChildClass1"){
std::unique_ptr<AbstractClass> ptr(new ChildClass1);
ptr->deserialize(in);
}
但我觉得这真的不是一个干净的OOP方式!
std::shared_ptr<AbstractClass> ptr;
默认初始化的共享指针指向空值。
通过空指针间接访问的行为未定义。
ptr->deserialize(in); //Raises an SIGSEGV error
这通过一个空指针间接进行。程序的行为未定义。
您可以通过摆脱动态分配来简化您的工作示例:
ChildClass1 c;
c.deserialize(in);
在这种情况下您不需要多态性。
what I'm trying to do is to instantiate and call whichever child class [determined at runtime]
您在这里尝试实现的实质上是 工厂方法 模式。在静态类型的 non-reflective 语言(如 C++)中没有简单的方法以通用方式实现工厂方法。您会发现大多数示例都使用简单的 if-else 结构,例如您自己建议的结构。
您可以看到一些在另一个 post 上创建通用工厂方法的尝试,这个答案似乎特别合适:。但正如我所说;不简单。
不幸的是,无法仅从基础 class 初始化 child class。序列化时,您必须为 child class 序列化某种 id。接下来,在反序列化时,我建议您使用 factory 模式。使用工厂,您可以传递要反序列化的 id 和 class 数据。该工厂函数将构建所需的 child class 和 return 指向基 class.
的指针