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 :

Possibilité d'utiliser une fonction membre mais pas de créer une instance


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut Possibilité d'utiliser une fonction membre mais pas de créer une instance
    Bonjour,

    je ne comprend pas bien ce qui cloche dans le code suivant (simplifié par souci de clarté) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // A.cpp
     
    #include "A.h"
    #include "B.h"
     
    void A::fonctionMembreDeA(C& c)
    {
          B b;                               // Erreur : expected ';' before b;
     
          c.b[2].fonctionMembreDeB();        // Pas de problème
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // A.h
     
    #include "C.h";                                  // Compile avec include mais pas avec déclaration anticipée
     
    class A
    {
    public:
          void fonctionMembreDeA(C& c);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // B.h
     
    class B
    {
    public:
          void fonctionMembreDeB();
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // C.h
     
    #include <vector>
     
    class B;
     
    class C
    {
    public:
          vector<B> b;
    };
    Dans ma fonction principale A, je peut donc utiliser une fonction membre de la classe B mais pas créer d'instance de cette classe !

    Je précise au cas ou ce serait utile que les fichiers B.h et C.h viennent toute deux d'un autre projet qui tourne très bien.

    Merci d'avance pour vos suggestions.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Est-ce juste une faute lors du copier coller, ou bien manque-t-il réellement le ";" après l'accolade fermante de la définition de tes classes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    C'est une erreur, il a bien un ';' après l'accolade fermante de chacune de mes classes.

    J'ai également oublié de préciser que le constructeur de ma classe B est bien public.

    Je modifie ça tout de suite.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Une autre précision :

    si je met (ça n'a aucun intérêt c'est juste pour le test) un ';' derrière mon type B et avant le nom de l'instance b de cette manière :

    Le compilateur me renvoi :
    - Statement has no effect (j'imagine que c'est pour B; )
    - 'b' was not declared in the scope

    Si cela peut vous aiguiller...

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Une autre précision :

    si je met (ça n'a aucun intérêt c'est juste pour le test) un ';' derrière mon type B et avant le nom de l'instance b de cette manière :

    Le compilateur me renvoi :
    - Statement has no effect (j'imagine que c'est pour B; )
    - 'b' was not declared in the scope

    Si cela peut vous aiguiller...
    Ben non, mais ca, c'est normal!!!

    le ";" est ce que l'on désigne comme le "end of statement" (fin de déclaration / d'instruction ) du C++. Avec un code comme B;, tu lui parle du type B (qu'il est sensé connaitre), mais tu ne lui dit pas quoi en faire... Et c'est pour cela qu'il te dit "cette instruction n'a aucun effet".

    Puis, comme tu as mis fin à l'instruction, tu te retrouve avec une autre instruction : b;, mais il n'a jamais rencontré b jusqu'à ce jour, (enfin, dans le contexte de la paire d'accolades qui l'entourent) et il ne le connait donc absolument pas. C'est la raison pour laquelle il te dit " 'b' n'était pas déclaré dans cette portée". La portée étant l'ensemble du code qui sépare l'accolade ouvrante de l'accolade fermante, à ceci près qu'il lit le code comme tu lis n'importe quelle page : du début à la fin, dans l'ordre exacte dans lequel les instructions sont écrites, si bien que, en l'occurrence, la portée se limite à l'espace qui existe entre l'accolade ouvrante et... le terme b.

    Ceci étant dit, pourrais tu nous dire l'erreur que le compilateur te donne, quand "il refuse que tu crées une instance de B, alors qu'il accepte que tu en appelle la méthode" Cela nous aidera surement à t'aider, car, bien que je me doute que tu aies tout simplifié au maximum, (ou peut être à cause de cela, justement), le code que tu présentes ne devrait pas poser de problème

    PS: Ah, et, au passage : le terme "méthode" en C++ est normalement limité aux fonction membres virtuelles, pour, justement, les distinguer de celles qui ne le sont pas... si bien qu'on utilise généralement les termes
    • données membres pour désigner les données qui font partie de la classe
    • fonctions membres pour désigner les fonctions de la classe qui ne sont pas virtuelles
    • méthodes pour désigner les fonctions virtuelles de la classe.

    Les autres langages (dont UML en premier) ne font pas ce genre de distinction, généralement parce qu'ils estiment qu'une fonction membre sera toujours virtuelle. Or, c'est vrai pour de très nombreux langages (généralement ceux qui utilisent une sorte ou une autre de "garbage collector"), mais pas en C++.

    D'ailleurs, en C++ les fonctions membres virtuelles sont considérées comme l'exception et non comme la règle : c'est la raison pour laquelle il faut explicitement l'indiquer quand une fonction doit l'être
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Pour la ligne 8 de mon A.cpp :

    il me renvoit :

    - expected ';' before b;
    - statement is a reference, not call, to function 'Polygon'
    - statement has no effect

    Alors que la ligne 10 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.b[2].fonctionMembreDeB();
    ne pose aucun problème et le code tourne très bien avec.

  7. #7
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ton erreur n'est pas reproductible avec le code que tu nous as fourni, on ne peut donc absolument rien en déduire. C'est bien de vouloir présenter un exemple minimal, encore faut-il qu'il reproduise exactement le comportement rencontré car aucun de nous ne dispose d'une boule de cristal.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Je sens la MACRO bien moisie.
    Utilisez les options de compilation qui permettent d'avoir le résultat du pré-processing et vérifiez que des MACRO foutent pas la grouille.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Je comprend bien que ce n'est pas évident pour vous de voir ce qui peut clocher dans un code simplifié comme ça. Je me disais que peut être l'erreur vous parlerais car ce serait difficile pour moi de mettre l'ensemble du code ...

    Concernant la compilation, quelle option permet d'avoir le résultat du pré-processing ?

    La seule macro dont j'ai la connaissance est le Q_OBJECT dans ma classe A qui hérite de QGLWidget.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Concernant la compilation, quelle option permet d'avoir le résultat du pré-processing ?
    C'est fonction du compilateur utilisé.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    J'utilise MinGW

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    C'est le moment d'aller voir le documentation.
    Moi, je connais pas.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Le seul moyen d'avoir un undefined et demander un ; avant le b dans B b; est que B ne soit pas défini.
    Btw ton code minimal est minimalement faux et ne montre rien
    - visibilité private par défaut dans les classes, tu n'es pas sensé pouvoir appeler fonctionMembreDeB non plus
    - l'include de C dans A.h est inutile et une forward declaration suffit

    Si j'emmène mon lapin chez le véto et lui demande pourquoi mon chat est malade, il aura du mal à me répondre...
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Citation Envoyé par kipgon Voir le message
    J'utilise MinGW
    Dans ce cas, pour n'exécuter que le préprocesseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ tonFichier.cpp -E -P -o fichierDeSortie.txt
    Remarques :
    • C'est l'option -E qui indique de n'exécuter que le préprocesseur.
    • L'option -P en complément est facultative, mais elle permet d'avoir un résultat moins lourd. Je te laisse tester avec et sans.
    • Selon l'emplacement de tes ".h", il se peut que tu aies besoin d'ajouter des options -IadresseDeDossier pour que le préprocesseur réussisse à exécuter les directives #include.
    • Si tu veux définir des macros en amont de la précompilation, par exemple NDEBUG en Release, il faut ajouter des options -DNOM_DE_LA_MACRO, par exemple -DNDEBUG.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Merci pour vos réponses concernant le préprocesseur, je vais étudier ça et je vous dirai ce que j'en ressort .

    Concernant le code simplifié, j'ai effectivement oublié de signaler que les fonctions membres et les attributs sont public. J'apporte la modification tout de suite !

    Concernant l'include plutôt que la déclaration anticipée, il se trouve que le code ne compile plus sans cela. Il doit déjà y avoir un truc de ce coté la !

    Je vais essayer de dégrader mon code tout en conservant mon erreur de compilation et je vous posterai ça.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/07/2014, 15h34
  2. Créer une fonction de plusieurs lignes à partir d'une chaine
    Par sopsag dans le forum Général Python
    Réponses: 5
    Dernier message: 21/10/2009, 18h29
  3. Réponses: 10
    Dernier message: 11/07/2008, 08h50
  4. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  5. utilisation de fonction membre dans une autre
    Par tcharles dans le forum C++
    Réponses: 4
    Dernier message: 14/12/2005, 17h19

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