我正在建立包装原始类型(例如整数,布尔值,浮点数等)以及容器类型(如向量,映射和集合)的对象的层次结构。我试图(能够)建立对象的任意层次结构,并能够轻松地设置/获取它们的值。该层次结构将传递到另一个类(此处未提及),并且将从该表示形式创建接口。这是此层次结构的目的,以便能够从这些对象创建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 objectIntProxy *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,即使您出于学习目的构建自己的解决方案,该代码也足够易于阅读和理解-如果您需要代码,请不要重新发明轮子,请使用。
10-07 14:12