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

Сообщение Mixin в С++ или как получить доступ к безымянным предкам от 26.12.2016 13:11

Изменено 26.12.2016 13:26 gencoder

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

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

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

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

class GLScene: public QGLWidget {
   ...
};

class Scene1Mixin {
   QGLWidget * w;
public:
   Scene1Mix( QGLWidget * _w ) { w = _w ; }
   draw1(){ w.glBegin(/* ...*/;}
}
class Scene2Mixin {
   QGLWidget * w;
public:
   Scene2Mix( QGLWidget * _w ) { w = _w ; }
   draw2(){ w.glBegin(/* ...*/;}
}

class Scene1: public GLScene, public Scene1Mix {
       Scene1( /*...*/ ) { /* w = this??? */ }
}
Вопрос по архитектуре.

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

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

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

class GLScene: public QGLWidget {
   ...
};

class Scene1Mixin {
   QGLWidget * w;
public:
   Scene1Mix( QGLWidget * _w ) { w = _w ; }
   draw1(){ w.glBegin(/* ...*/;}
}
class Scene2Mixin {
   QGLWidget * w;
public:
   Scene2Mix( QGLWidget * _w ) { w = _w ; }
   draw2(){ w.glBegin(/* ...*/;}
}

class Scene1: public GLScene, public Scene1Mix {
       Scene1( /*...*/ ) { /* w = this???; ...*/ draw1(); }
}