gpt4 book ai didi

C++ 动态类(动态 hack)

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

有没有办法在运行时向类添加一个字段(一个以前不存在的字段)?像这样的片段:

Myobject *ob; // create an object
ob->addField("newField",44); // we add the field to the class and we assign an initial value to it
printf("%d",ob->newField); // now we can access that field

我真的不在乎它是如何完成的,我不在乎它是否是一个丑陋的 hack,我想知道它是否可以完成,如果可能的话,还有一个小例子。

另一个例子:假设我有一个描述这个类的 XML 文件:

<class name="MyClass">
<member name="field1" />
<member name="field2" />
</class>

并且我想将字段“field1”和“field2”“添加”到类中(假设该类已经存在)。假设这是该类的代码:

class MyClass {
};

我不想在运行时创建类,我只想向现有类添加成员/字段。

谢谢!

最佳答案

使用 map 和变体。

例如,使用 boost::variant。参见 http://www.boost.org/doc/libs/1_36_0/doc/html/variant.html

(当然,您可以创建自己的,以适合您的 XML 属性的类型。)

#include <map>
#include <boost/variant.hpp>

typedef boost::variant< int, std::string > MyValue ;
typedef std::map<std::string, MyValue> MyValueMap ;

通过将 MyValueMap 添加为您的类的成员,您可以根据它们的名称添加属性。这意味着代码:

oMyValueMap.insert(std::make_pair("newField", 44)) ;
oMyValueMap.insert(std::make_pair("newField2", "Hello World")) ;
std::cout << oMyValueMap["newField"] ;
std::cout << oMyValueMap["newField2"] ;

通过将它封装在一个 MyObject 类中,并在这个 MyObject 类中添加正确的重载访问器,上面的代码变得更加清晰:

oMyObject.addField("newField", 44) ;
oMyObject.addField("newField2", "Hello World") ;
std::cout << oMyObject["newField"] ;
std::cout << oMyObject["newField2"] ;

但是这样做会在某种程度上失去 C++ 的类型安全性。但对于 XML,我想这是不可避免的。

关于C++ 动态类(动态 hack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/235376/

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