对象初始化

Objects initialization

本文关键字:初始化 对象      更新时间:2023-10-16

我想用C++构建一个框架,而C++没有内置的类似C#的反射特性是一个困难。

我试图解决的问题是:我有一个对象,我会在运行时知道它的类的名称(作为字符串),在运行时也会知道它的属性的名称(以字符串)。然后我想知道在运行时创建这个类的实例并在其属性中放入默认值而不必创建另一个构造函数的最佳方法是什么。

此外,我希望避免使用第三方库,如boost和编译器特定的功能。

感谢您的帮助,任何提示/想法都将不胜感激!

在纯标准C++中是不可能的(在运行时根据类的名称实例化),因为C++11没有反射。

然而,你可以考虑像这样的东西

  • 添加您自己的元对象协议,就像Qt一样(参见其moc
  • 有自己的惯例并使用X宏技巧
  • 自定义您的C++编译器,例如,如果使用GCC扩展MELT
  • 使用工厂设计模式结合动态链接àla dlopen(3)

我建议在您的框架中定义一些约定,并实现工具,以满足您的需求。例如,您可以定义自己的根类,并添加C++代码生成器(如Qt中的moc)来帮助您。

还可以研究像Poco(当然还有Qt)这样的框架。

它很简单:

#include <string>
using namespace std;
class Blog
{
public:
    Blog(string  t, string d) : title(t), description(d) {}
    string getTitle() {return title;}
    void setTitle(string t) {title = t;}
    // etc...
private:
    string title;
    string description;
}

然后启动

Blog *blog = new Blog {"The Title", "Blog description"};
class Blog
{
  public:
     Blog() {}
     Blog(std::string s1, std::string s2): Title(s1), Description(s2){}
     // add get, set methods separately as required
     // alternately, you may declare Title, Description as public:
  private:
     std::string Title;
     std::string Description;
}
...Then we use it somewhere
Blog blog = new Blog("The Title", "Blog description");