Qt interfaces ou des classes abstraites et qobject_cast()
J'ai une assez complexe ensemble de classes C++ qui sont ré-écrit à partir de Java. De sorte que chaque classe a une seule classe héritée, et puis il met également en œuvre une ou plusieurs des classes abstraites (ou interfaces).
Est-il possible d'utiliser qobject_cast()
pour convertir à partir d'une classe à l'une des interfaces? Si je retire toutes les interfaces de QObject
, j'obtiens une erreur due à l'ambigu QObject
références. Si toutefois, je n'ai que la classe de base hérité de QObject
, je ne peux pas utiliser qobject_cast()
parce que cela fonctionne avec QObject
s.
Je voudrais être en mesure de jeter autour de classes entre les plugins et les Dll appelés par leurs interfaces.
- Comme je suis en train de lire de plus en plus dans les docs, je ne suis pas sûr de ce que je veux faire, c'est possible...et ce n'est pas bon. Je pourrais utiliser le RTTI base .dynamicCast<T>() mais ça ne sonne pas comme ça serait pour toujours à travers les limites de la DLL.
- J'ai trouvé ceci: stackoverflow.com/questions/3201273/... donc je suppose que ça a déjà été demandé.
Vous devez vous connecter pour publier un commentaire.
Après quelques recherches et la lecture le qobject_cast documentation, j'ai trouvé ceci:
Voici le lien pour l'exemple: Plug & Peinture.
Après l'excavation de la les interfaces d'en-tête dans l'exemple, j'ai trouvé le Q_DECLARE_INTERFACE macro qui doit vous permettre de faire ce que vous voulez.
D'abord, ne pas hériter
QObject
de vos interfaces. Pour chaque interface que vous avez, utilisez le Q_DECLARE_INTERFACE déclaration comme ceci:Alors dans la définition de votre classe, utilisez la Q_INTERFACES macro, comme ceci:
Après toutes ces difficultés, le code suivant fonctionne:
if (YourInterface *i = qobject_cast<YourInterface*>(c)) { }
. Cela garantit que le pointeur n'est jamais utilisée si elle n'est pas valide.=
dans unif
est une bonne pratique, car beaucoup de gens confondent avec le==
.Q_DECLARE_INTERFACE
et que votre classe hérite deQObject
et listes de votre interface enQ_INTERFACES
?