当前位置:  开发笔记 > 编程语言 > 正文

C++动态类(动态黑客)

如何解决《C++动态类(动态黑客)》经验,为你挑选了1个好方法。

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

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

我真的不在乎它将如何完成,我不在乎它是否是一个丑陋的黑客,我想知道它是否可以完成,如果可能的话,这是一个小例子.

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


   
   

我希望将"field1"和"field2"字段"添加"到类中(假设该类已经存在).假设这是该类的代码:

class MyClass {
};

我不想在运行时创建一个类,我只想将成员/字段添加到现有的类中.

谢谢 !



1> paercebal..:

使用地图和变体.

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

(但是,当然,您可以创建自己的,以适应XML属性的类型.)

#include 
#include 

typedef boost::variant< int, std::string > MyValue ;
typedef std::map 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,我猜这是不可避免的.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有