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 :

Visibilité d’un objet d’une autre classe C++


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Mars 2019
    Messages
    13
    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 : 13
    Points : 7
    Points
    7
    Par défaut Visibilité d’un objet d’une autre classe C++
    Voici un mini programme C++ sous CodeBlocs
    Ce que je cherche à faire :
    J’ai une classe principale <Domus> qui en déclare une vingtaine d’autres secondaires dans un projet de domotique.
    Cette classe contient des tableaux qui sont alimentés par diverses classes secondaires principalement des capteurs et des données Internet), je n’en ai indiqué qu’une pour simplifier.
    D’’autres classes secondaires exploitant ces données (par exemple l’IHM <Nextion> qui affiche données et courbes).
    Je n’ai pas compris comment faire plus proprement (sans variables globales) car il me faut des tableaux d’échanges entre toutes les classes, et je pensais que la classe principale était l’endroit pour les regroupper.
    Mais ma classe secondaire, qui appelle qui une méthode de la classe principale ne voit pas son objet <domus>.
    Merci chers confinés pour votre aide


    www.voilec.com


    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //#include <iostream>
    #include "Domus.h"
     
    Domus domus;
     
    int main()
    {
    domus.startDomus () ;
    }
    Nextion.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
     
    #ifndef NEXTION_H
    #define NEXTION_H
     
    class Nextion    // Une des 20 classes annexes
    {
        public:
     
            float allSensors [11] ; //Tableau de transfert entre classes
     
            void nextGetData (void) ;
     
    Nextion();
    ~Nextion();
    };
     
    #endif // NEXTION_H
    Nextion.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 "CC_Nextion.h"
        #include "CC_Domus.h"
     
     
        void CC_Nextion::getDataNxt ()
        {
        float x = ccdomus.getData (0);
        std::cout<< x<< '\n';
        }
     
        CC_Nextion::CC_Nextion()
        {}
        CC_Nextion::~CC_Nextion()
        {}
    Domus.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
    20
    21
    22
    23
     
    #ifndef DOMUS_H
    #define DOMUS_H
     
    #include <array>
     
    class Nextion ;
     
    class Domus  // Classe principale
    {
        public:
        //static float allSensors [11] ;
        static std::array<float, 11> allSensors; // declare a float array with length 11
     
        void startDomus (void) ;
        float getData(short number) ;
     
     
    Domus();
    ~Domus();
    };
     
    #endif // DOMUS_H

    Domus.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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include "Domus.h"
     
    Nextion nxtion ;
     
    float Domus::allSensors [] = {0} ;
     
    // ****************************************************
     
    void Domus::startDomus ()
    {
    allSensors [0]  = 9876 ; // Une des valeurs calculée par une autre classe
    nxtion.nextGetData (); // Simule une demande de la classe secondaire
    }
     
    // ****************************************************
     
    float Domus::getData(short number)
    {
    return (allSensors [number]) ;
    }
     
    // ****************************************************
     
    Domus::Domus()
    {}
    Domus::~Domus()
    {}

  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,

    Heuu, il y a un problème avec les codes que tu nous donnes, parce que celui qui est identifié comme faisant partie de Nextion.cpp est en fait celui de Nextion.h

    Mais, pour te permettre d'avancer un tout petit peu:
    1. Evite la directive using namespace std; qui pose plus de problèmes qu'elle n'en résout, et qui n'existe que pour le code écrit avant 1998. Ton code n'entre très clairement pas dans cette catégorie
    2. Evite les variables globales: à la longue, cela va poser bien plus de problèmes que cela n'en résout
    3. Veille à n'inclure les fichiers d'en-tête que lorsque tu en as vraiment besoin, c'est à dire
      1. <iostream> n'a aucun besoin d'être inclus dans Nextion.h. Il pourra peut-être s'avérer intéressant de l'inclure dans Nextion.cpp mais cela reste encore à voire
      2. Nextion.h n'a aucun besoin d'être inclus dans Domus.h. S'il doit être inclus quelque part, ce sera dans Domus.cpp
    4. Evite les tableaux "à la C": si tu veux un tableau de taille fixe, connue à la compilation, tourne toi vers std::array; si tu veux un tableau de taille dynamique, dont le nombre d'éléments varie au fil de l'exécution, tourne toi vers std::vector.
    5. Heuu... Quel est l'intérêt de travailler avec une classe si toutes les données qu'elle contient sont publiques
    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
    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
    L'objet Domus n'a aucun intérêt puisque les seules données dedans sont static. Autant faire un namespace.
    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.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Mars 2019
    Messages
    13
    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 : 13
    Points : 7
    Points
    7
    Par défaut Premiers correctifs
    Merci koala01 et Bousk pour vos remarques très constructives.
    Je viens d’essayer d’en tenir compte.
    J’ai déclaré l’objet <domus> car dans le vrai programme contient des dizaines d’autres méthodes non statiques, je ne voyais pas comment faire autrement.
    Il semble que ma conception soit bancale, car je suis parti de mon programme monobloc sous Arduino, gros tas <.ino> de 6000 lignes qui marche très bien mais qui devient inmaintenable, et j’ai cherché à l’éclater en classes propres avec méthodes courtes.
    Cela m’a amené énormément de problèmes en compilation séparée, dont cet exemple, car je n’ai pas assez de connaissances en C++

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/08/2017, 17h11
  2. Réponses: 6
    Dernier message: 05/03/2012, 21h53
  3. Réponses: 2
    Dernier message: 01/06/2007, 08h57
  4. Réponses: 2
    Dernier message: 30/12/2006, 13h34
  5. Réponses: 1
    Dernier message: 05/05/2006, 14h37

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