包含对象和容器的容器

Posted

技术标签:

【中文标题】包含对象和容器的容器【英文标题】:Container containing Objects and Containers 【发布时间】:2011-05-05 13:57:56 【问题描述】:

我正在尝试创建一个将被迭代的结构,并且存储在其中的对象将按从左到右的顺序绘制。但是会有一些容器存储在可绘制对象旁边。这些容器我认为它们是绘图堆栈,其中可绘制的对象被绘制在彼此的顶部。我写了一些粗略的伪代码,但我无法想出一个通用接口来让我的容器和可绘制对象都继承自。我的目标是容器和可绘制对象之间的通用接口。我想我可以通过插入容器来做到这一点,即使它们里面只有一个可绘制对象,我觉得这只会占用更多内存并降低速度。我也不想避免强制转换对象来获得正确的调用。有人可以建议我应该做什么,我不是最先进的程序员,但我确实努力提高速度和减少代码。这是我到目前为止所拥有的(我知道一些接口调用与依赖项不匹配,我只是不知道该怎么做):

class IDrawable 
  protected:
    signal_t sig; // this is an enumeration
  public:
    void paint(QPainter &painter); // This functionality will be defined here since it is painting to a pixmap

    virtual void reset() = 0;
    virtual void init() = 0; // Setup code will go here
    virtual void update(float) = 0;
;

class Signal : public virtual IDrawable 
  private:
    bool state; // By default this will be false
  public:
    Signal();
    virtual ~Signal();
    // Parameters for update is 0 or 1, since the graphic is just toggled on or off
    virtual void update(float) = 0; // Drawing happens here. Will draw to pixmap
    bool state() return state;
;

class Gage : public virtual IDrawable 
  private:
    float cur_val;
  public:
    Gage();
    virtual ~Gage();
    virtual void init() = 0; // Setup code will go here
    virtual void update(float) = 0; // Drawing happens here. Will draw to pixmap
;

class TextGage : public virtual Gage 
  public:
    TextGage();
    virtual ~TextGage();
    void update(float); // Define update functionality here
;

// a stack can coexist with a Gage object in a container
class DrawableStack : public virtual IDrawable 
  private:
    QMap<signal_t, IDrawable*> *Stack;
  public:
    DrawableStack();
    virtual ~DrawableStack();

    void init() 
        Stack = new QMap<signal_t, IDrawable*>();
    

    void update(signal_t,float); // Drawing happens here. Will draw to pixmap

    void setStack(QMap<IDrawable*> *gageStack) 
        Stack = gageStack;
    

    void push(IDrawable* node) 
        Stack.insert(node->sigType, node);
    
;

【问题讨论】:

【参考方案1】:

这是您需要应用的经典复合设计模式:

http://en.wikipedia.org/wiki/Composite_pattern

【讨论】:

是的,这正是我要找的。现在我只需要弄清楚如何搜索具有特定信号 ID 的孩子 看起来像是访客的工作 ;) en.wikipedia.org/wiki/Visitor_pattern【参考方案2】:

我认为,您正在寻找的是复合模式...

【讨论】:

以上是关于包含对象和容器的容器的主要内容,如果未能解决你的问题,请参考以下文章

Vector容器 和 iteration 迭代器

如何理解Python中的容器对象

业务对象 - 容器还是功能? [关闭]

创建一个包含该类所有实例的静态成员容器的类?

07-容器

Java集合框架