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 :

Un pointeur qui n'en fait qu'a sa tête...


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut Un pointeur qui n'en fait qu'a sa tête...
    J'ai un gros problème avec un pointeur de ma classe :

    Si je le créer avent de lencer la moindre fonction, avent main, juste après les includes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Srt::Sprit *Var = new Srt::Sprit_Animer();
    Var->Config();
     
    19 E:\Files\c++\PlayTheGame\main.cpp expected constructor, destructor, or type conversion before '->' token 
    19 E:\Files\c++\PlayTheGame\main.cpp expected `,' or `;' before '->' token
    Si je met tout sa après avoir initialiser SDL(ma clèsse déclare des objets SDL, du genre SDL_Rect, Uint32, et certaines des fonctions de ma classe appèlent des fonctions sdl, voici la nouvelle éreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Var = new Srt::Sprit_Animer();
        Var->Config();
     
     E:\Files\c++\PlayTheGame\main.cpp In function `int SDL_main(int, char**)': 
    54 E:\Files\c++\PlayTheGame\main.cpp 'class Srt::Sprit' has no member named 'Config'
    La classe Sprit_Animer hérite de Sprit, et contien ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        class Sprit_Animer : public Sprit
        {
              public:
                  Sprit_Animer(Ani_Sprit *Conf);
                  virtual ~Sprit_Animer();
     
                  virtual bool BlitSurface(SDL_Surface *screen);
     
                  Ani_Sprit *Config()
                  {return &Config_;}
                  //...
        }
    Voila, je comence a me demende ce qui arive a ce pointeur :'(
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    ta classe Spirit ne possède pas de fonction config certainement, or, ton pointeur est déclaré comme Spirit*, il faut faire un cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast<Srt::Sprit_Animer*>(Var)->Config();
    PS : tu as certainement fait ceci en pensant au polymorphisme, pour utiliser le polymorphisme, il faut créer une fonction Config dans la classe de base, et la déclarer "virtual" (éventuellement, abstraite avec un = 0 à la fin de sa déclaration, mais attention, rendre une fonction membre d'un classe abstraite, rend la classe elle même abstraite, et donc non-instantiable !, il est peut-être plus pratique de définir la fonction comme sans effet, par exemple, ta fonction revoyant un pointeur, elle renverrait simplement un NULL dans la classe de base, mais renverrais le pointeur adéquate pour ta classe dérivée)

    Si tu as pas tout compris, hésite pas à demander des infos
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Je ne comprend pas ce qu'est un cast(c'est un peut come (int)VariableChar; ?)

    Sinon le polymorphisme ne permet pas de créer un pointeur de la classe mère(Sprit) et de mêtre un objet de la classe dériver(Sprit_Animer) dedan?

    Et même si sela résoudra le problème du membre inexistant, sa ne résoud pas le "expected constructor, destructor, or type conversion before '->' token " ...
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    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
    Je ne comprends pas où tu mets ce code : Avant main dis tu ? Si ton fichier ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // début fichier
    #include "Sprit_Animer.h"
    Srt::Sprit *Var = new Srt::Sprit_Animer();
    Var->Config(); 
     
    int main()
    {
    }
    C'est normal que ça pose problème, la première ligne déclare une variable globale, et l'initialise, ok, mais la seconde essaie d'exécuter une instruction, ce qu'il n'est possible de faire qu'à l'intérieur d'une fonction.
    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.

  5. #5
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Aa! D'acod merci. Mais enfaite la fonction Config renvoi un pointeur, en gros je devrais pouvoir faire :
    Var->Config()->x = 50;


    Et pour le problème du polymosphisme?
    Je trouve bizare que si je fait :
    class C1
    {
    int Variable;
    }
    class C2 : public C1
    {
    int GVar(){return Variable}
    }
    Que je ne puisse pas faire(dans la fonction main) :
    C1 *Obj = new C2;
    Obj->GVar();
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Par défaut
    STP utilises les balises code.

    La classe C1 n'a pas de méthode GVar().
    Comme dit plus haut, il faut que la méthode existe dans C1 avec le mot clé virtual (tu la définis ou pas, suivant si tu veux instancier des C1 ou non).
    Si ton objet était vraiment un C1 (et non un C2), que fait le code ??? Quelle méthode peut-il bien appeler ???
    Si tu veux manipuler un C2 avec un pointeur sur C1, il faut que C1 possède toute l'interface (mais pas nécessairement l'implémentation).

  7. #7
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Et si je met ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class C1 
    {
    virtual Function();
    }
    class C2
    {
        virtual bool Function();//On sais jamais au cas ou une autre classe érite de celle ci...
    }
    C2::Function()
    {return true;}
    C'est corecte???
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  8. #8
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    c'est correct à condition de déclarer ta fonction dans la classe de départ comme bool également
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class C1 
    { 
    virtual Function(); 
    } 
    class C2 
    { 
        virtual bool Function();//On sais jamais au cas ou une autre classe érite de celle ci... 
    } 
    C2::Function() 
    {return true;}
    Dans C1, Function doit être définie ou pure (et de même type de retour) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class C1
    {
     virtual bool Function(){return ????};
    ....
     
    ou
     
     virtual bool Function() =0;
    Dans le deuxième cas , tu ne peux plus instancier de classe C1

  10. #10
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    C'est pas vraiment pratique sa...
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  11. #11
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    C'est pour cela que je te proposais de renvoyer un NULL dans le cas de la classe de base !

    Dans tous les cas, les deux fonctions doivent avoir la même signature à la virtualité près... et la fonction de la classe de base doit être au moins virtuelle
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

Discussions similaires

  1. [XL-2007] Fichier CSV qui n'en fait qu'a sa tête !
    Par Dreadnought dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/11/2012, 09h25
  2. Test qui ne se fait pas
    Par GLDavid dans le forum Linux
    Réponses: 12
    Dernier message: 07/03/2006, 14h57
  3. [MFC] Accès pointeur qui donne rien :s
    Par EagleEye dans le forum MFC
    Réponses: 3
    Dernier message: 02/03/2006, 18h32
  4. Pb de selection qui ne se fait pas
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 10h54
  5. Réponses: 8
    Dernier message: 04/08/2004, 14h17

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