Как использовать идиому pimpl с Qt и подклассами QObject

Я хотел бы знать, как проще всего реализовать идиому pimpl в объектах Qt. Я хочу иметь что-то вроде этого:

прыщ.ч:

class B;

class A: public QObject {
    B *b;
}

pimpl.cxx:

class B: public QObject {
}

Теперь, как очевидно, Qt не пропустит класс B, чтобы создать для него moc. Как с этим можно справиться? Я хочу иметь реализацию B в .cxx явно.


person code_not_yet_complete    schedule 26.07.2016    source источник
comment
Возможный дубликат Как использовать идиому Qt PIMPL?   -  person TheDarkKnight    schedule 27.07.2016
comment
@TheDarkKnight Насколько я вижу, в связанном ответе нет упоминания о том, что сам класс impl является QObject, поэтому я проголосовал за то, чтобы оставить его открытым.   -  person anderas    schedule 27.07.2016


Ответы (2)


Вы можете создать pimpl-private.h, который содержит определение B и включен только из pimpl.cxx и больше нигде. Затем вы можете запустить moc над этим заголовком.

person Sebastian Redl    schedule 26.07.2016
comment
Да, это нормально. Тем не менее, я искал хак, если это возможно, чтобы сохранить его в файле .cxx, так как я больше привык к нему и мне не нужно объявлять/включать типы там по большей части. - person code_not_yet_complete; 26.07.2016
comment
@code_not_yet_complete: см. stackoverflow.com/questions/34928933/ - person peppe; 26.07.2016

Можно иметь код в файле .cpp, добавив

#inlude "pimpl.moc"

в конце (!) «pimpl.cxx» и повторном запуске qmake. Это создаст правило Makefiule для запуска файла через moc и поместит вывод в «pmipl.moc», чтобы все волшебным образом заработало.

person yama    schedule 27.07.2016