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 :

Visibilité en compilation séparée


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    mars 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : mars 2019
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Visibilité en compilation séparée
    Bonjour
    Je me heurte à un problème en compilation séparée de visibilité entre classes que j’ai simplifié au maximum ainsi :

    La classe B
    possède seulement une fonction qui renvoie un entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ret1234 ()     {return (1234) ;}
    B.h
    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
    #ifndef B_H
    #define B_H
     
    class B
    {
    public:
     
    int ret1234 (void) ;
     
    B();
    ~B();
     
    };
     
    #endif // B_H

    B.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "B.h"
     
    int B::ret1234 ()
    {
    return (1234) ;
    }
     
    B::B()
    {}
     
    B::~B()
    {}

    La classe A
    fait un #include <B.h>,
    instancie dans le constructeur un objet B : {B objB ;},
    déclare la fonction de B en externe : extern int ret1234 (void) ;,
    et appelle la fonction de B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int A::getValB (void)      {return (objB.ret1234 ()) ;}
    A.h
    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
    #ifndef A_H
    #define A_H
     
    #include <B.h>
     
    extern int ret1234 (void) ;
     
    class A
    {
    public:
     
    int getValB (void) ;
     
    A();
    ~A();
     
    };
     
    #endif // A_H
    A.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
    #include "A.h"
     
    int A::getValB (void)
    {
    return (objB.ret1234 ()) ; // <<<<<<<<<<<<< Le compilateur ne connait pas objB
    }
     
    A::A()
    {
    B objB ; // Instanciation objet classe B
    }
     
    A::~A()
    {}
    Le main
    instancie un objet A : A objA ;,
    et appelle la fonction : objA.getValB ().

    Main.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
    #include <iostream>
     
    using namespace std;
     
    #include <A.h>
     
    A objA ; // Instanciation objet classe A
     
     
    int main()
    {
    cout << "Test visibilite entre classes!" << endl;
    cout << objA.getValB () << endl;
    return 0;
    }
    La compilation sous CodeBlocs me renvoie
    A.cpp ligne 5 : ‘obj B’ was not declared in this scope.
    Je ne comprends pas mon erreur triviale de débutant !
    J'ai mis tout ce misérable projet codeBlocs ici :

    http://www.voilec.com/medias/200123.rar
    Merci par avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    septembre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : septembre 2015
    Messages : 98
    Points : 551
    Points
    551
    Par défaut
    je n'ai pas téléchargé ton projet

    mais à 1ere vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int A::getValB (void)
    {
    return (objB.ret1234 ()) ; // <<<<<<<<<<<<< Le compilateur ne connait pas objB
    }
    le compilateur recherche un élément qui s'appelle objB qui appartient à la classe A (ou qui est créé dans la méthode getValB, mais ce n'est pas le cas ici)

    or ta classe A n'a pas de tel élément

    ok, tu l'instancies dans le constructeur, mais celui ci n'est visible que dans le constructeur

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    mars 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : mars 2019
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Merci pour ton oeil du tigre
    Effectivement, je ne voyais pas cette stupidité dans le constructeur.
    J'ai déplacé l'instanciation dans A.cpp et tout marche comme prévu.
    Merci encore

    Le A.cpp correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "A.h"
     
    B objB ; // Instanciation objet classe B
     
    int A::getValB (void)
    {...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 223
    Points : 28 230
    Points
    28 230
    Billets dans le blog
    2
    Par défaut
    Ta solution est mauvaise. Là tu crées un objet global objB.
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    mars 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : mars 2019
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Global c'est caca
    Merci, cela est vrai, mais comment faire propre ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    septembre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : septembre 2015
    Messages : 98
    Points : 551
    Points
    551
    Par défaut
    je te l'avais dit au dessus
    Citation Envoyé par Xelland Voir le message
    or ta classe A n'a pas de tel élément

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

Discussions similaires

  1. Compilation séparée ?
    Par kromartien dans le forum C
    Réponses: 8
    Dernier message: 22/04/2007, 11h41
  2. Compilation séparée avec devc++
    Par javamax dans le forum Dev-C++
    Réponses: 6
    Dernier message: 08/02/2007, 19h56
  3. Compilation séparée
    Par oliv928 dans le forum Dev-C++
    Réponses: 6
    Dernier message: 02/01/2007, 18h41
  4. Compilation séparée sous devcpp
    Par Mic75 dans le forum Dev-C++
    Réponses: 1
    Dernier message: 23/08/2006, 16h33
  5. Compilation séparée avec dev C/C++
    Par benjiprog dans le forum Dev-C++
    Réponses: 5
    Dernier message: 07/11/2005, 19h26

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