c++ - 如何在 C++ 中创建正确的对象层次结构

标签 c++ oop

我正在构建一个包含基本类型(例如整数、 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_intget_intset_stringget_stringset_value_for_keyget_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::anyboost::variant。与您建议的最接近的是 boost::any,即使您出于学习目的想要构建自己的解决方案,代码也足够简单,易于阅读和理解——如果您需要代码,请不要不要重新发明轮子,使用 boost::any

关于c++ - 如何在 C++ 中创建正确的对象层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3178309/

相关文章:

Java split() 返回一个空的第一个元素

c++ - AMD_pinned_memory - 同步传输到纹理

python - 在两个相关类中使用继承的最佳方式是什么

c++ - 制作动态对象数组问题?

c++ - 如何将我的 Qt 应用程序主窗口始终放在 Windows 任务栏上方?

php - 没有属性的对象可以吗?

javascript - 只要属性的值就可以惯用地填充数组

c++ - 即使使用 "new"关键字,二进制搜索树插入也不会在堆上创建数据

c++ - C 风格字符串、指针、数组

c++ - 图的平均最优路径