Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++_Design Patterns_Class Design - Fatal编程技术网

C++ 如何实现属性列表?

C++ 如何实现属性列表?,c++,design-patterns,class-design,C++,Design Patterns,Class Design,当谈到属性列表时,我指的是存储类的附加信息的通用列表 最简单的情况: 类有一个std::map。第一个字符串命名属性(如“Color”),第二个字符串描述值(如“Yellow”)。 在本例中,另一个使用这些属性的类需要检查映射中是否存在某个属性名,然后解析该值。 然而,在谈论性能时,这并不是最好的概念 您将如何实现这样的属性列表? 有没有这样的设计模式或库 我对C++的方法特别感兴趣,但是如果有与语言无关的解决方案,也请发布它们 如果类需要具有动态属性,而用户不希望继承每个属性,则可以使用属性列

当谈到属性列表时,我指的是存储类的附加信息的通用列表

最简单的情况:
类有一个
std::map
。第一个字符串命名属性(如
“Color”
),第二个字符串描述值(如
“Yellow”
)。
在本例中,另一个使用这些属性的类需要检查映射中是否存在某个属性名,然后解析该值。
然而,在谈论性能时,这并不是最好的概念

您将如何实现这样的属性列表?
有没有这样的设计模式或库

我对C++的方法特别感兴趣,但是如果有与语言无关的解决方案,也请发布它们

如果类需要具有动态属性,而用户不希望继承每个属性,则可以使用属性列表。
如果这有帮助,您可以查看我关于该主题的其他问题:

编辑:
当然,我忘记了一些信息(感谢评论):
属性可以应用于对象。同一类的对象可能有不同的属性。对象的属性可以更改(值可以更改,可以添加/删除属性)

希望这能澄清一点。

我也做了类似的事情

如果属性对于类的所有实例都是公共的,那么对类进行单独的元描述,在其中描述属性。然后,每个实例提供一个简单的boost::any类型的向量(我不使用boost::any,而是使用类似于我们自己编写的东西)

如果每个实例的属性可以不同,那么为每个实例创建一个映射,其中键是atom,值是boost::any(或类似值)。在Windows下,原子是字符串的一种数值表示。首先使用字符串表示“属性名”,然后将其转换为原子,并将其用作映射中的键。使用数字原子而不是字符串将加快映射中属性的查找(前提是您将原子值保留在某个位置,并且不需要每次需要属性值时都执行字符串到原子的查找)

不要使用属性作为存储类数据成员的常规方式。如果这样做,调试将成为一场噩梦,因为很难看到类中的实际值是什么。此外,设置观察点也将变得不可能

仅使用这些属性存储无法放入普通数据成员中的内容,例如: -您事先不知道这些属性(例如,它们可能是特定于客户的) -您不想在两个类之间引入依赖关系(甚至是通过名称)

请查看Boost属性映射

动态属性映射 解决对接口的需求 属性映射,其检查为 延迟到运行时。几个组成部分 结合起来,为动态应用程序提供支持 属性映射。动力学性质 类收集一组异构数据 从 Boost属性映射库。每个 属性映射被指定为 添加到时基于字符串的键 收藏,它可以是 用那把钥匙。内部,, 动态_属性会对每个属性进行调整 包含具有 动态属性映射接口,该接口 提供get和put函数 可以使用任何类型的值调用 这符合一些要求。 在内部,动态属性映射 转换键对和值对以满足 基础设施的要求 属性映射或向运行时发出信号 如果不能,则为例外


这些“属性”是每个类还是每个对象?是否有可能在运行时更改属性?您打算如何使用属性?这是一个有趣的问题,但是您没有充分说明属性列表的需求。在silico的权利中,您根据实际需求来设计它,例如运行时灵活性、内存使用、性能等。。它可能是Enum/strings/ints/boost::any到boost::any、变体、抽象基类等的映射,或者如果您认为您先前关于在这些“属性列表”和继承之间进行选择的问题是相关的,那么它意味着需求更加模糊。