我正在构建一个包含基本类型(例如整数、 bool 值、 float 等)以及容器类型(如 vector 、映射和集合)的对象层次结构。我正在尝试(能够)构建对象的任意层次结构,并能够轻松设置/获取它们的值。此层次结构将传递给另一个类(此处未提及),并且将从该表示创建一个接口(interface)。这是这个层次结构的目的,能够从这些对象创建 GUI 表示。更准确地说,我有这样的东西:
class ValObject
{
public:
virtual ~ValObject() {}
};
class Int : public ValObject
{
public:
Int(int v) : val(v) {}
void set_int(int v) { val = v);
int get_int() const { return val; }
private:
int val;
};
// other classes for floats, booleans, strings, etc
// ...
class Map : public ValObject {}
{
public:
void set_val_for_key(const string& key, ValObject* val);
ValObject* val_for_key(const string& key);
private:
map<string, ValObject*> keyvals;
};
// classes for other containers (vector and set) ...
客户端应该能够创建对象的任意层次结构,轻松设置和获取它们的值,而作为初级程序员的我应该学习如何正确地为这样的对象创建类。
我面临的主要问题是如何通过指向基类 ValObject
的指针设置/获取值。起初,我以为我可以在基类中创建很多函数,比如 set_int
、get_int
、set_string
、get_string
、set_value_for_key
、get_value_for_key
等,并使它们仅适用于正确的类型。但是,我会遇到很多情况,函数什么都不做,只会污染我的界面。我的第二个想法是创建各种代理对象来设置和获取各种值,例如
class ValObject
{
public:
virtual ~ValObject() {}
virtual IntProxy* create_int_proxy(); // <-- my proxy
};
class Int : public ValObject
{
public:
Int (int v) : val(v) {}
IntProxy* create_int_proxy() { return new IntProxy(&val); }
private:
int val;
};
class String : public ValObject
{
public:
String(const string& s) : val(s) {}
IntProxy* create_int_proxy() { return 0; }
private:
string val;
};
然后客户端可以使用此代理通过 ValObject 设置和获取 Int 的值:
ValObject *val = ... // some object
IntProxy *ipr = val->create_int_proxy();
assert(ipr); // we know that val is an Int (somehow)
ipr->set_val(17);
但是在这种设计下,我仍然有太多的类需要在各个子类中声明和实现。这是正确的方法吗?有没有其他选择?
谢谢。
最佳答案
查看现有解决方案的 boost::any
和 boost::variant
。与您建议的最接近的是 boost::any
,即使您出于学习目的想要构建自己的解决方案,代码也足够简单,易于阅读和理解——如果您需要代码,请不要不要重新发明轮子,使用 boost::any
。
关于c++ - 如何在 C++ 中创建正确的对象层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3178309/