Информация об изменениях

Сообщение Re: Minix в С++ или как получить доступ к безымянным предкам от 26.12.2016 14:00

Изменено 26.12.2016 14:02 kov_serg

Здравствуйте, gencoder, Вы писали:

G>Вопрос по архитектуре.


G>Требуется предусмотреть расширение функциональности некоторого класса GLScene (не обязательно весь функциональный набор будет использован в финальной сборке).

G>Функциональность связана с рисованием некоторых сцен (тестовых).

G>Для этого создаем классы примеси Scene1Mix, Scene2Mix. Каждый из классов хранит указатель w на объект типа окно QGLWidget на котором будет выполняться рисование.


G>Вопрос: как правильно передать указателю w указатель на безымянный объект типа QGLWidget (т.е. на GLScene)?

G>Или подскажите более подходящее архитектурное решение.

Уберите всё из конструктора и замените private на protected:
struct Scene1Mixin {
  Scene1Mix() { w=0; }
  virtual ~Scene1Mix() {}
  void setWidget(QGLWidget *w) { this->w=w; }
  void draw1(){ w->glBegin(/* ...*/;}
protected:
  QGLWidget * w;
};

struct Scene1 : Scene1Mixin {
  void draw2() { draw1(); w->...  }
};

Scene1 createScene1(QGLWidget * w) {
  Scene1 *s=new Scene1();
  s->setWidget(w);
  //s->someOtherMagic();
  return s;
}

И создание переложи на отдельный клас
Re: Minix в С++ или как получить доступ к безымянным предкам
Здравствуйте, gencoder, Вы писали:

G>Вопрос по архитектуре.


G>Требуется предусмотреть расширение функциональности некоторого класса GLScene (не обязательно весь функциональный набор будет использован в финальной сборке).

G>Функциональность связана с рисованием некоторых сцен (тестовых).

G>Для этого создаем классы примеси Scene1Mix, Scene2Mix. Каждый из классов хранит указатель w на объект типа окно QGLWidget на котором будет выполняться рисование.


G>Вопрос: как правильно передать указателю w указатель на безымянный объект типа QGLWidget (т.е. на GLScene)?

G>Или подскажите более подходящее архитектурное решение.

Уберите всё из конструктора и замените private на protected:
struct Scene1Mixin {
  Scene1Mix() { w=0; }
  virtual ~Scene1Mix() {}
  void setWidget(QGLWidget *w) { this->w=w; }
  void draw1(){ w->glBegin(/* ...*/;}
protected:
  QGLWidget * w;
};

struct Scene1 : Scene1Mixin {
  void draw2() { draw1(); w->...  }
};

Scene1* createScene1(QGLWidget * w) {
  Scene1 *s=new Scene1();
  s->setWidget(w);
  //s->someOtherMagic();
  return s;
}

И создание переложи на отдельный клас