Проблемы с множественным наследованием QObject и дизайном политик / черт в C ++ - PullRequest
1 голос
/ 27 июля 2011

В свободное время я создаю довольно большое приложение на основе плагинов, и столкнулся с недостатком дизайна, который останавливал шоу.Мое приложение использует дизайн на основе политик / черт, но поскольку я использую Qt, это делается только через MI (а не через шаблоны и MI).Некоторые из этих классов являются чисто виртуальными, а некоторые выполняют довольно важные функции, которые конечный пользователь никогда не должен касаться.

Моя проблема в том, что некоторые из этих классов требуют сигналов / слотов и, следовательно, являются производными от QObject, нетпроблема, которую я могу просто унаследовать от нее.Однако у меня возникает проблема, когда я хочу получить из класса Qt, а затем расширить его с помощью одной или нескольких моих черт, например:

class Sy_abstractGLViewport : public QGLWidget, public Sy_saveable, public Sy_abstractObject
{
    ...
}

Здесь QGLWidget получен из QObject, но не виртуально, вызываяпроблемы неоднозначности.

Я рассмотрел шаблон Bridge, где я делаю, например, мой Sy_saveable чистый виртуальный, а затем извлекаю из него Sy_saveable_imp, который содержит фактическую реализацию.Затем используйте это для моего Sy_abstractGLViewport через агрегацию.

Это мне кажется довольно непрофессиональным, потому что приложение основано на плагинах, для моих будущих авторов плагинов это немного PITA, чтобы "подключить" весь интерфейсметоды для агрегированного экземпляра.Я даже не могу автоматизировать его с помощью макросов, потому что конечный пользователь может захотеть переопределить метод.

У кого-нибудь есть шаблон для решения этой проблемы?Или шаблон, который не требует ИМ, но дает мне такую ​​же гибкость?Это мой личный хобби-проект, я не против сделать много рефакторинга - я хочу сделать это право .

1 Ответ

1 голос
/ 27 июля 2011

Вы не можете наследовать от множества кратных, которые наследуют QObject.

Попробуйте использовать композицию вместо наследования. См. композиция над наследованием .

Вы также можете попробовать использовать Q3Signal class. Хотя это относится к старому QT3 согласно документу QT:

Класс Q3Signal может использоваться для отправки сигналов для классов, которые не наследовать QObject.

...