Контейнер, содержащий объекты и контейнеры - PullRequest
1 голос
/ 05 мая 2011

Я пытаюсь создать структуру, которая будет перебираться, и объекты, хранящиеся в ней, будут отрисовываться в порядке слева направо. Но будут контейнеры, которые хранятся рядом с нарисованными объектами. Эти контейнеры я рассматриваю как стеки для рисования, где нарисованные объекты рисуются друг над другом. У меня написан какой-то грубый код psuedo, но я не могу придумать общий интерфейс, чтобы наследовать мой контейнер и рисуемый объект. Моя цель - общий интерфейс между контейнерами и объектами для рисования. Я подумал, что смогу сделать это, просто вставив контейнеры, даже если внутри них будет только один нарисованный объект, но мне кажется, что это просто занимает больше памяти и снижает скорость. Я также не хотел бы избегать приведения объектов для получения правильных вызовов. Может кто-нибудь подсказать, что мне делать, я не самый продвинутый программист, но я стремлюсь к скорости и сокращению кода. Вот что у меня есть (я знаю, что некоторые вызовы интерфейса не соответствуют зависимостям, я просто не знаю, что):

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);
    }
};

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

Это классический шаблон проектирования Composite, который вам нужно применить:

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

1 голос
/ 05 мая 2011

Я думаю, вы ищете композитный паттерн ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...