Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;,避免RTTI和访客模式,可能吗?_C++_Design Patterns_Rtti_Visitor Pattern - Fatal编程技术网

C++ C++;,避免RTTI和访客模式,可能吗?

C++ C++;,避免RTTI和访客模式,可能吗?,c++,design-patterns,rtti,visitor-pattern,C++,Design Patterns,Rtti,Visitor Pattern,我一直在寻找一些相关的线索,但仍然没有找到任何可以回答以下问题的答案 假设我有一个类的层次结构(例如小部件、HTML元素),它们形成了一个树结构。当我遍历树或根据其ID查找具体元素时,我会得到一个指向基类的指针(树算法只知道基类) 然后,基于该类型(基类有一个标识该类型的字段),我执行一个动态_转换,以获得一个指向具体类型的指针。我一直在想办法避免这种情况。我唯一想到的是访客模式。但我不太喜欢这种模式 有没有其他方法/模式可以在不使用RTTI或访问者模式的情况下搜索/迭代节点并获取指向具体类的指

我一直在寻找一些相关的线索,但仍然没有找到任何可以回答以下问题的答案

假设我有一个类的层次结构(例如小部件、HTML元素),它们形成了一个树结构。当我遍历树或根据其ID查找具体元素时,我会得到一个指向基类的指针(树算法只知道基类)

然后,基于该类型(基类有一个标识该类型的字段),我执行一个动态_转换,以获得一个指向具体类型的指针。我一直在想办法避免这种情况。我唯一想到的是访客模式。但我不太喜欢这种模式


有没有其他方法/模式可以在不使用RTTI或访问者模式的情况下搜索/迭代节点并获取指向具体类的指针?

您的方法听起来不是个好主意。主要是因为您必须在运行时之前完成所有考虑事项

您要做的基本上是列出并访问对象的特定属性。使用动态强制转换,这是可能的,但很难做到完美——因为您必须提前编写一列开关,并对每种可能性进行硬编码,以便在运行时使用它

我通常推荐的解决方案是Qt框架。您可以在运行时列出每个对象的属性,通过其名称字符串或索引访问特定属性,甚至在运行时附加代码中不存在的属性。所有这些都是类型不可知的,你不需要知道对象的类型就可以知道它的属性,最后-Qt为qobject派生类提供了更快的
qobject\u cast
,而不是
dynamic\u cast


元系统允许您知道类名、基类名、方法、枚举、构造函数和几乎所有内容,因此除了属性之外,它还是访问实例可用的所有功能的良好来源。

这实际上取决于访问者模式的实现。使用dynamic_cast是一种方法,另一种可能是通过定义可以在所有子类中实现的虚拟GetType()函数来使用手工制作的RTTI。根据该函数的结果,您可以执行不同的操作。

您将如何使用该指针?如果你只调用方法,你可能会避开虚拟方法。如果你的多态层次结构设计得很好,你可以避开虚拟调用,而不必求助于更昂贵的动态强制转换。你为什么不喜欢这种模式?@user1192525-我明白了这个想法,但你所说的似乎是一个非常糟糕的设计意图。整个框架的存在就是为了解决这类问题,您可以查看Qt的属性,这些属性可以在运行时列出、更改甚至添加。有一个元对象编译器,它在元对象系统之上生成所有必要的锅炉板代码。所有这些都是类型不可知的,您只需要从QObject中派生出来。@user1192525-如果您知道对象确实是该类型的,那么使用static_cast进行向下转换是绝对安全的。“因为您必须提前编写一列开关,并对每种可能性进行硬编码,以便您可以在运行时使用它。”这就是访问者模式。他知道静态类型是什么。所以动态转换不会涉及任何开关之类的东西。@Nicolas-他希望能够访问多态树中项目的完整属性和方法集。我认为如果不事先对每个选项进行硬编码,这是不可能的。
dynamic_cast
将确认指针是否属于给定的类,但仅此而已,指针仍仅限于硬编码的内容。他仍然需要根据类型进行切换,并在特定实例可用的各个功能之间进行切换。他似乎认为是这样,因为他说
static\u cast
对他有用。所以,在使用的时候,他清楚地知道它是静态的什么类型。@Nicolas-我认为你忽略了更大的问题-知道它是什么类型-这只是冰山一角。如果他想在运行时调用属性和方法,知道类型只是一小步,他仍然需要索引和硬编码每个场景。Qt元系统可以为他完成所有这些工作,这些工作随着层次结构中类的数量及其深度而增长。