对象初始化 我想在C++中建立一个框架,C++没有内置的C类反射特征是一个难点。p>
我试图解决的问题是:我有一个对象,在运行时我知道它的类名(作为字符串),在运行时我也知道它的属性名(作为字符串)。然后我想知道在运行时创建此类实例并在其属性中放入默认值而不必创建另一个构造函数的最佳方法是什么 此外,我希望避免使用第三方库,如boost和编译器的特定功能 谢谢你的帮助,任何提示/想法都将不胜感激 很简单:对象初始化 我想在C++中建立一个框架,C++没有内置的C类反射特征是一个难点。p>,c++,C++,我试图解决的问题是:我有一个对象,在运行时我知道它的类名(作为字符串),在运行时我也知道它的属性名(作为字符串)。然后我想知道在运行时创建此类实例并在其属性中放入默认值而不必创建另一个构造函数的最佳方法是什么 此外,我希望避免使用第三方库,如boost和编译器的特定功能 谢谢你的帮助,任何提示/想法都将不胜感激 很简单: #include <string> using namespace std; class Blog { public: Blog(string t, s
#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;
}
在C++标准中,不可能(在运行时以其名称实例化类),因为C++ 11没有反射。
但是,你可以考虑像之类的事情。
- 添加您自己的元对象协议,就像Qt那样(请参见其
)moc
- 拥有自己的约定并使用X宏技巧
- 使用工厂设计模式,结合动态链接
还可以查看一些框架,例如(当然还有)。在哪个操作系统上?使用哪种编译器?什么标准版本(C++11或更高版本)?感谢您的回答,现在让我们说一下Windows。实际上,我希望它能够跨平台运行。您的问题是,类和属性名称是在运行时确定的字符串,但您的代码显示它们在编译时是已知的。你到底需要做什么?你能解释一下你的代码片段和你想要实现的目标之间的关系吗?然后修复代码样本,或者至少删除它。从给出的答案中可以看出,这只会让人困惑。+使用工厂设计模式非常感谢您的回答。这根本不是一个好的新东西,反射真的是C++的一个缺失的特征。彼得斯。工厂模式如何实现这一点?因为我需要额外的构造函数,不是吗?@red2nb:不是“构造函数”,而是基于提供的字符串创建/获取对象的工厂方法/对象。谢谢。我需要深入研究以正确理解它,但是factory design模式+dlopen似乎回答了我的问题,尽管我觉得动态链接会引入我不想要的开销。我将尝试更多地了解它,以了解它如何更详细地工作,我希望我能够为最终用户抽象出这一点。这肯定不是OP要求的。这不是OP要求的,但是,必须有人编写代码,即使是工厂模式
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");