C++ 如何以多态方式无限嵌套对象

C++ 如何以多态方式无限嵌套对象,c++,polymorphism,nested,C++,Polymorphism,Nested,我有一个Config类,它包含数据的映射,用于保存配置键和值。有时,我不知道什么时候在编译时,我希望能够访问该对象中的一个键作为该对象的另一个(子)实例-我希望能够嵌套,理论上是无限的 未分析的数据看起来像这样 someKey = someVal keysnkrates = "itsastring" # comments keyConfig = ( subKey = 1 another = 3.14159 subKeyConfig = ( ..

我有一个
Config
类,它包含数据的
映射,用于保存配置键和值。有时,我不知道什么时候在编译时,我希望能够访问该对象中的一个键作为该对象的另一个(子)实例-我希望能够嵌套,理论上是无限的

未分析的数据看起来像这样

someKey     = someVal
keysnkrates = "itsastring"
# comments

keyConfig = (
    subKey  = 1
    another = 3.14159
    subKeyConfig = (
        ...inf...
    )
)

otherVals = ...
我如何准确地解析这样的东西而不诉诸hack-yc-like方法?我不想处理原始指针,也不想处理空值,但是我提出的唯一解决方案是在
Config
类的指针上加上一个标记,如果它是
!nullptr
则它是一个子配置对象。

如果您编写以下内容:

struct foo {
    int a, b, c;
    struct bar nested_struct;
}
然后,每次分配一个新的
foo
,您就为三个int和一个完整的
bar
对象分配了足够的空间,不管它有多大

您不能以这种方式“无限”嵌套结构/类,因为您的计算机没有无限内存

我不知道您所说的原始指针是什么意思,但如果您不希望使用指针和空值创建自己的链接数据结构,那么您可能应该使用标准库中的一些预定义容器类。†

<>我不是C++程序员,所以我不知道什么类和库是可用的,但我确信它们是存在的。


†(编辑)不太可能。您编写的每一行代码最终都会成为一种负担。如果您正在编写真正的(商业)软件,那么编写的行数超过您解决手头问题所需的行数总是错误的。如果有一个库可以满足您的需要,那么您应该使用它。

如果您编写以下内容:

struct foo {
    int a, b, c;
    struct bar nested_struct;
}
然后,每次分配一个新的
foo
,您就为三个int和一个完整的
bar
对象分配了足够的空间,不管它有多大

您不能以这种方式“无限”嵌套结构/类,因为您的计算机没有无限内存

我不知道您所说的原始指针是什么意思,但如果您不希望使用指针和空值创建自己的链接数据结构,那么您可能应该使用标准库中的一些预定义容器类。†

<>我不是C++程序员,所以我不知道什么类和库是可用的,但我确信它们是存在的。



†(编辑)不太可能。您编写的每一行代码最终都会成为一种负担。如果您正在编写真正的(商业)软件,那么编写的行数超过您解决手头问题所需的行数总是错误的。如果有一个库可以满足您的需要,那么您应该使用它。

有时候,问题的最佳解决方案取决于具体问题的具体情况。在您的例子中,其中一个细节是您希望最终如何使用生成的数据结构(哪种形式的查询应该工作/工作得快?)

除此之外,如果您注意到问题的特定属性并以机会主义的方式利用它们,有时“捷径”也是可能的

虽然输入数据的结构显然意味着树状数据结构,但一个可能的机会主义捷径是,如果子配置数据中的键在所有级别上的所有出现键集中都是唯一的。然后,您可以简单地使用地图,并依赖于没有同义词键。当然,这将从数据中删除结构信息,您需要决定是否可以接受这些信息

扩展这个想法,有时您还可以通过重新考虑将什么用作地图的键来避免实现树:现在您使用的是字符串。它也可以是类似元组的(键、级别)或层次结构中键的串联到“路径”(例如“top/topchild/topchildchild”)。同样,如果这是一种可行的方法,这取决于您以后将如何处理数据


最后同样重要的一点是,如果您找到一种方法将新条目推回数组并使用数组索引来表示父/子关系,那么您也可以实现没有经典树结构(指针)的树。

有时问题的最佳解决方案是由具体问题的具体情况决定的。在您的例子中,其中一个细节是您希望最终如何使用生成的数据结构(哪种形式的查询应该工作/工作得快?)

除此之外,如果您注意到问题的特定属性并以机会主义的方式利用它们,有时“捷径”也是可能的

虽然输入数据的结构显然意味着树状数据结构,但一个可能的机会主义捷径是,如果子配置数据中的键在所有级别上的所有出现键集中都是唯一的。然后,您可以简单地使用地图,并依赖于没有同义词键。当然,这将从数据中删除结构信息,您需要决定是否可以接受这些信息

扩展这个想法,有时您还可以通过重新考虑将什么用作地图的键来避免实现树:现在您使用的是字符串。它也可以是类似元组的(键、级别)或层次结构中键的串联到“路径”(例如“top/topchild/topchildchild”)。同样,如果这是一种可行的方法,这取决于您以后将如何处理数据


最后同样重要的一点是,如果您找到一种方法将新条目推回数组并使用数组索引来表示父/子关系,那么您也可以实现没有经典树结构(指针)的树。

只需使用普通STL映射即可。你认为(至少)JSON和XML解析器在C++中有什么作用?
struct Config{
  Data data;
  std::map <std::string,Config> children;
}
struct-Config{
数据;
地图儿童;
}
现在,按照您的意愿设置内部嵌套值:

Config config;
config.children["My Inner Config "] = Config(<my data>);
config.children["My Inner Config "].children["My inner inner config"] = Config(<more data>);
Config;
config.children[“我的内部配置”]=config