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

C++ Discussion :

Pb de pure interface


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut Pb de pure interface
    Salut a tous
    Bon voila je me fait insulter à coup d'access violation sur un code basique pour tester les pure interfaces. L'access violation a lieu dans la seule ligne que coprend le main. Voila le code:

    itest.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class ITEST
    {
    protected:
    	ITEST();
    public:
    	virtual ~ITEST();
    	virtual void affichage(char *texte) = 0;
    };
     
    extern ITEST *Itest;
    itest.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <iostream.h>
    #include "itest.h"
     
    ITEST *Itest=NULL;
     
    ITEST::ITEST()
    {
    }
     
    ITEST::~ITEST()
    {
    }
    test.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "itest.h"
     
    class TEST : public ITEST
    {
    public:
    	TEST();
    	~TEST();
    	void affichage(char *texte);
    };
    test.cpp
    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
     
    #include <iostream.h>
    #include "test.h"
     
    TEST::TEST()
    {
    }
     
    TEST::~TEST()
    {
    }
     
    void TEST::affichage(char *texte)
    {
    	cout << texte << endl;
     
    }
    et enfin main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <iostream.h>
    #include "itest.h"
     
    void main(void)
    {
    	Itest->affichage("toto");
    }

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    salut

    iostream.h

    ton pointeur est NULL.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    - à quel moment appelles-tu ton constructeur ?
    - à quel moment fais-tu un new ?
    - à quel moment fais-tu un delete ?

  4. #4
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    De plus, initialiser un pointeur NULL d'une classe abstraite, c'est très, très mal

  5. #5
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Voilà quelque conseils:
    • - Utilse <iostream> et l'espace de nom std à la place de <iostream.h>.
      - Dans un source (.h ou .cpp) n'inclus que ce que tu as besoin dans ce source. Par exemple n'inclus pas iostream partout.
      - Ensuite la fonction main retourne un entier:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      #include <cstdlib>
       
      int main(){
         return EXIT_SUCCESS;
      }
      - Protège tes h contre les mutiples inclusions. #ifndef, #define, #endif.
      - Je ne comprends pas pourquoi tu déclares la variable Itest en extern dans le h. Pourquoi ne pas tout simplement le faire dans ton main. Idem pour la définition.
      - Le pointeur NULL du c est maintenant 0 dans la norme c++.


    Ensuite tu à une erreur de conception:
    - Tu définis le pointeur Itest comme étant le pointeur NULL, et du appelles une fonction sur ce pointeur... Comme disait Luther et bigboomshakala, tu doit avant de faire cette appel allouer quelquechose dedans à l'aide de new.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par MatRem
    - Le pointeur NULL du c est maintenant 0 dans la norme c++.
    NULL existe aussi en C++.
    Si certains (parmi les gourous) préconnisent d'utiliser 0, d'autres préconnisent d'utiliser NULL. Il y a des bons arguments de chaque côté. (Côté NULL : Lisibilité, explicitation de l'intention du développeur, côté 0 : ne pas cache les nature entière de 0). Des discussions pour l'ajout d'un véritable pointeur nul on régulièrement lieu. peut-être dans C++0x. Le dernier nom choisi en date est si je ne me trompe un truc comme null_ptr.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    On peut toujours redefinir NULL = 0 quelquespart;
    Par contre il me semble quand même que dans la dernière norme du c++, c'est 0 qui est défnit comme étant le pointeur nul.

    Par contre je trouve plus explicite d'utiliser NULL, et je n'ai pas compris pourquoi la norme l'avait remplacé.
    côté 0 : ne pas cache les nature entière de 0)
    je ne comprends pas.

  8. #8
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Mais le truc c'est que j'ai quasi copier coller un code compile et link sans probleme.Je suis d'accord que c'est le pointeur Itest qui merde mais c'est pas une erreur de norme vu que c'est une erreur à l'execution.Le pb est ailleurs que de se poser des questions sur NULL ou 0.De plus je declare un pointeur pour utiliser les fonctions de ma classe car je n'ai pas de données dedans.

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par bigboomshakala
    ton pointeur est NULL.
    Citation Envoyé par Luther13
    à quel moment fais-tu un new ?
    allo. comment tu fais toi pour appeler une fonction membre non statique d'une classe sans instancier d'objet ???

    Citation Envoyé par tu
    De plus je declare un pointeur pour utiliser les fonctions de ma classe car je n'ai pas de données dedans.
    déclarer != instancier

  10. #10
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    On peut arréter de discuter sur le pointeur null, mais on a déjà répondu à ta question...
    As tu modifié ton code, quel est le nouveau problème?

  11. #11
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par bigboomshakala
    Citation Envoyé par bigboomshakala
    ton pointeur est NULL.
    Citation Envoyé par Luther13
    à quel moment fais-tu un new ?
    allo. comment tu fais toi pour appeler une fonction membre non statique d'une classe sans instancier d'objet ???
    static

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par MatRem
    On peut toujours redefinir NULL = 0 quelquespart;
    Par contre il me semble quand même que dans la dernière norme du c++, c'est 0 qui est défnit comme étant le pointeur nul.
    Cen'est pas si simple... Chaque type de pointeur a une valeur nulle, qu'on ne peut pas écrire directement. Par contre, quand on converti une valeur entière nulle en pointeur, la convertion est valide, et a comme résultat la valeur nulle du pointeur considéré.
    Citation Envoyé par La norme §4.10
    A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type.

    Citation Envoyé par MatRem
    Par contre je trouve plus explicite d'utiliser NULL, et je n'ai pas compris pourquoi la norme l'avait remplacé.
    Elle n'a jamais vraiment remplacé quoi que ce soit. Il n'y a jamais eu moyen en C++ ou en C d'écrire directement la valeur nulle d'un type pointeur.
    Citation Envoyé par MatRem
    côté 0 : ne pas cache les nature entière de 0)
    je ne comprends pas.
    NULL est un #define sur 0. Et 0 est un entier, avant d'être le pointeur nul. Donc, si on écrit du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int f(int) {cout <<"int"<<endl;}
    int f(char*){cout<<"char*"<<endl;}
    f(0); // Affiche int, ce qui ne surprends personne
    f(NULL); // Affiche int aussi
    Le deuxième cas peut surprendre les gens qui pensent que NULL défini un pointeur, alors qu'il ne définit qu'un int valant 0.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    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
    Surtout qu'en C, NULL est généralement un pointeur, comme ((void*)0).

    Moi, je suis pour utiliser NULL, qui est le plus explicite. Je suis également pour utiliser '\0' au lieu de juste 0 pour un caractère nul, pour les mêmes raisons.

    Sinon, un autre moyen peut être d'utiliser des NULL spécifiques à certains types. Bien qu'optionnels (on peut toujours utiliser NULL à la place) ils signaleront une erreur (ou un warning, je ne sais plus) si on les utilises sur un pointeur d'un autre type...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define LDC_NULL ((struct st_listeDblChainee *)0)
    #define ELDC_NULL ((struct st_elementListeDblChainee *)0)
    Ici, on peut employer NULL à la place de l'un ou l'autre, mais on ne peut employer l'un à la place de l'autre.
    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.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/06/2007, 14h36
  2. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  3. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  4. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  5. [VB6] [Interface] Icones de boutons de barre d'outils
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/09/2002, 15h50

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