IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

VC++ 2003 : Impossible d’instancier une classe abstraite


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut VC++ 2003 : Impossible d’instancier une classe abstraite
    Bonjour à tous

    J’ai écris une class dérivant de l’interface ITTAPIEventNotification dérivant elle même de l’interface IUnknown comportant une seule fonction virtuelle pure Event que j’ai implémenté dans ma classe.
    Mais lorsque j’essai de créer un objet de cette classe j’ai erreur suivante :

    Impossible d’instancier une classe abstraite

    Ci – dessous la déclaration de ma classe :

    class CTapiEventNotification : public ITTAPIEventNotification
    {
    // Implementation
    public:
    virtual /*[helpstring][id]*/ HRESULT STDMETHODCALLTYPE Event(
    /*[in]*/ TAPI_EVENT TapiEvent,
    /*[in]*/ IDispatch *pEvent);

    static bool RegisterEvent();
    static bool RegisterCallNotifications(ITAddress* pAddress,
    VARIANT_BOOL fMonitor,
    VARIANT_BOOL fOwner,
    long lMediaTypes);
    };


    J’aimerai savoir si quelqu’un d’autre a déjà eu ce problème et comment il l’a résolu.

    Merci d’avance pour toute aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Salut,

    Je sais pas si ca va t'aider mais bon j'avais trouver ca dans la FAQ:
    http://c.developpez.com/faq/cpp/?pag...LASS_abstraite

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Merci, mais cette FAQ ne résoud pas mon problème.

    Mais je me demande si je dois implémenter les fonctions virtuelles pures (AddRef, Release et QueryInterface) de l'interface IUnknown.
    Etant donné que je ne vois pas la déclaration de ces fonctions dans l'interface ITTAPIEventNotification.

    Dites moi si je me trompe.
    Merci.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben oui, tu dois : Elles sont déclarées dans une interface que tu implémentes (ou dont hérite une interface que tu implémentes).
    Par contre, il est anormal qu'elles ne soient pas déclarées dans ITTAPIEventNotification : Cela la rend inutilisable en C, à moins que la déclaration C soit à coté (ce qui est généralement le cas pour les fichiers d'en-tête générés automatiquement).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    J'ai en effet implémenté les trois fonctions de l'interface IUnknown et la compilation s'effectue sans erreurs.

    Mon implémentation de QueryInterface consiste simplement à créer une instance de ma classe que je retourne lorsqu'on appelle QueryInterface avec le paramètre riid=IID_IUnknown ou IID_ITTAPIEventNotification.
    J'appelle enssuite AddRef() sur cette nouvelle instance avant de sortie de la fonction.

    J'espère que c'est correct ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Non, QueryInterface() retourne un pointeur vers le même objet (ou un objet contenu qui implémente l'interface, comme fait dans les vieux COM tutorial samples).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Exemple d'implémentation de QueryInterface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class CoUneClasse : public IUnknown
    {
    	//Déclaration des méthodes de IUnknown
     
    	class CImplIUneInterface : public IUneInterface
    	{
    	//Déclaration des méthodes de IUneInterface
    	CoUneClasse *pObj;
    	};
     
    	class CImplIUneAutreInterface : public IUneAutreInterface
    	{
    	//Déclaration des méthodes de IUneAutreInterface
    	CoUneClasse *pObj;
    	};
     
    	friend class CImplIUneInterface;
    	friend class CImplIUneAutreInterface;
    	CImplIUneIterface m_implIUneInterface;
    	CImplIUneAutreInterface m_implIUneAutreInterface;
    };
    Ceci a l'avantage d'éviter tout héritage multiple.
    L'implémentation de QueryInterface() dans les vieux COM Tutorial Samples retourne alors un pointeur vers l'objet extérieur ou l'un des objets contenus qui implémentent les autres interfaces.

    Il est aussi possible de faire un héritage multiple de toutes les interfaces dans l'objet principal, c'est ce qui est fait dans ATL...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    J'ai signalé au depart que ma classe (CTapiEventNotification ) derivait de ITTAPIEventNotification :

    class CTapiEventNotification : public ITTAPIEventNotification
    {

    };

    Le pointeur *pObj (CoUneClasse *pObj que tu mentionnes est crée à quel moment ?

    Je pense que je vais aller voir dans les ATL.

    Merci.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est le pointeur vers l'objet extérieur (l'objet COM), créé au moment où l'objet est instancié.

    Tu l'initialises à this dans le constructeur de l'objet extérieur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Merci beaucoup pour ta réactivité.
    je pense que j'y suis.

    Mais j'ai également un autre souci : QueryInterface me retourne l'erreur :
    "Interface non implémenté"
    Et je ne vois pas la raison. j'ai d'ailleurs ouvert une discussion à ce sujet dont le titre est :

    "TAPI2 avec VC++ 2003 : Interface ITStreamControl non implémenté"

    si tu pouvais y jeter un coup d'oeil.
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur: Impossible d'instancier une classe abstraite
    Par petitnul12 dans le forum C++
    Réponses: 2
    Dernier message: 16/11/2012, 23h39
  2. Réponses: 5
    Dernier message: 29/12/2010, 15h13
  3. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  4. Réponses: 2
    Dernier message: 27/03/2005, 16h09
  5. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo