对象初始化

时间:2014-09-08 12:47:45

标签: c++

我想用C ++构建一个框架,而且C ++没有内置的类似c#的反射功能是一个难点。

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

另外,我想避免使用像boost这样的第三方库,以及编译器的特定功能。

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

3 个答案:

答案 0 :(得分:3)

在纯粹的标准C ++中,不可能(在运行时通过名称实例化一个类),因为C ++ 11没有反射。

但是,你可以考虑像

这样的事情
  • 添加您自己的元对象协议,就像Qt一样(请参阅其moc
  • 拥有自己的约定并使用X-macro技巧
  • 自定义您的C ++编译器,例如如果使用GCC使用MELT
  • 进行扩展
  • 使用工厂设计模式与动态链接{la dlopen(3)

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

另请参阅Poco(当然还有Qt)等框架。

答案 1 :(得分:1)

这很简单:

#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;
}

然后到init

Blog *blog = new Blog {"The Title", "Blog description"};

答案 2 :(得分:1)

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");