gpt4 book ai didi

c++ - 是否可以创建一个 C++ 工厂系统来创建任何 "registered"对象类型的实例,而不考虑继承?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:03 24 4
gpt4 key购买 nike

我花了一整天的时间研究这个主题,所以我带着一些关于这个主题的零散知识来向您提出这个问题。请允许我描述一下我正在尝试完成的工作,也许您可​​以建议解决眼前问题的方法,或者建议另一种完全解决问题的方法。

我正在尝试模仿与 XAML 文件在 WPF 中的工作方式相关的内容,您实际上是在根据 XML 定义实例化对象树。如有不妥,请告知。此问题在其他方面与 WPFC# 或任何管理的内容无关 - 我仅提及它是因为它是一个类似的概念..

因此,我已经创建了一个XML 解析器类,并生成了一个基于ObjectNode 对象的节点树。 ObjectNode 对象包含一个名为 type 的字符串值,并且它们具有子 ObjectNode 对象的 std::vector

下一步是根据ObjectNode 树中的数据实例化一棵对象树。需要此中间 ObjectNode 树,因为同一个 ObjectNode 树可能会根据需要实例化多次或延迟。正在创建的对象树使得树中的节点是公共(public)基类的后代,现在我们可以将其称为 MyBase。叶节点可以是任何类型,不一定来自 MyBase

为了使这更具挑战性,我不知道树中可能涉及哪些类型的对象,因此我需要允许向工厂注册新类型。

我知道 boost 的工厂。他们的文档在 this 上有一个有趣的小设计段落页:

<我>o 我们可能想要一个接受一些参数的工厂,这些参数被转发给构造函数,
o 我们可能会想使用智能指针,
o 我们可能需要多个成员函数来创建不同种类的对象,
o 我们可能不一定需要对象的多态基类,
o 正如我们将看到的,我们根本不需要工厂基类,
o 我们可能只想调用构造函数 - 无需#new# 在堆栈上创建对象,并且
o 最后我们可能想使用定制的内存管理。

我可能没有完全正确地理解这一点,但这似乎表明我正在尝试做的事情可以通过 boost 的工厂来完成。但是我找到的所有示例似乎都描述了所有对象都从基类型派生的工厂。

如有任何相关指导,我们将不胜感激。

感谢您的宝贵时间!

最佳答案

为工厂方法定义一个 typedef,例如:

typedef void* (*FactoryMethod)(const vector<string>& parameters);

换句话说,每个工厂方法都返回一个指向任何东西的指针(一个指向 void 的指针),并将一个字符串常量 vector 作为参数。

注册数据如下:

std::map<string, FactoryMethod> globalFactoryMethods;

... 其中键是 string 类型,值是指向相应工厂方法的指针。当您拥有具有新工厂方法的新类型时,通过将其添加到映射(在运行时)来“注册”它。

使用注册工厂方法的构造可能如下所示(伪代码):

foreach (Node node in nodes)
{
string type = node.type;
FactoryMethod factoryMethod = globalFactoryMethods[type];
void* constructedLeaf = (*factoryMethod)(node.nParameters, node.pParameters);
//do something here with constructed leaf
}

Leaf nodes can be of any type, not necessarily derived from MyBase.

这是 C++ 中的一个问题:如果您不知道它们是什么,那么您将如何删除它们?

C#(与 C++ 不同)可以在不知道内容是什么的情况下删除内容,或者更确切地说,它不需要删除内容:因为它是托管内存,所有内容都是 System.Object 的子类。

关于c++ - 是否可以创建一个 C++ 工厂系统来创建任何 "registered"对象类型的实例,而不考虑继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2893978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com