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

Langage C++ Discussion :

Aide pour liaison de class


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 33
    Par défaut Aide pour liaison de class
    salut as tous , je souhaite modifier un "bool passeEnModeChauffage" d'une classe "Froid" via une autre class "Chauffage", comment puis-je faire merci

    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
    29
    30
    31
    32
    33
    34
    35
     
    #ifndef FROID_H
    #define FROID_H
     
    #include <ctime>
     
    #include "consignes.h"
    #include "temperatures.h"
    #include "filtre.h"
    #include "relais.h"
     
    class Froid
    {
     
    public:
        Froid();
     
        bool gifFroid = false;
     
        bool gifVentilationFroid = false;
        bool gifVentilationIntFroid = false;
        bool gifsVitessesIntFroid = false;
        bool gifVentilationExtFroid = false;
        bool gifVentilationDegFroid = false;
     
        bool gifDegivrageFroid = false;
        bool gifEgouttageFroid = false;
     
        bool degivrageFroid = false;
     
        bool passeEnModeChauffage = false;
        bool passeEnModeCanicule = false;
     
        void modeFroid();
        void etatArretFroid();
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include "froid.h"
     
    #include <QDebug>
     
    Froid::Froid()
    {
        qDebug() << "Froid";
     
        m_froidConsignes = new Consignes(QString("settings/consignes.ini"), QSettings::IniFormat);
     
        m_froidTemperatures = new Temperatures(QString("settings/temperatures.ini"), QSettings::IniFormat);
     
        m_froidFiltre = new Filtre(QString("settings/filtre.ini"), QSettings::IniFormat);
    }
     
    void Froid::etatMarcheFroid()
    {
        m_froidRelais.desactiveRelaiEteHiver();
        departTempoVoletsFr = time(NULL);
        transitionGainableFroid = TEMPO_VOLETS_FROID;
    }
     
    void Froid::etatVoletsFroid()
    {
        gifVentilationFroid = true;
        m_froidRelais.activeRelaisVentilationInt();
        m_froidFiltre ->departChronoFiltre = time(NULL);
        departTempoControleTemperatureFr = time(NULL);
        transitionGainableFroid = TEMPO_CONTROLE_TEMPERATURE_FROID;
    }
     
    void Froid::etatControleTemperatureFroid()
    {
        m_froidRelais.activeRelaisVentilationInt();
    }
     
    void Froid::etatDepartFroid()
    {
        gifVentilationFroid = false;
        gifVentilationIntFroid = true;
        gifVentilationExtFroid = true;
        m_froidRelais.activeRelaisVentFroid();
        departTempoV4VFr = time(NULL);
        transitionGainableFroid = TEMPO_V4V_FROID;
    }
     
    void Froid::etatModeFroidChauffage()
    {
        passeEnModeChauffage = true;
        etatArretFroid();
        transitionGainableFroid = ARRET_FROID;
    }
    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
    29
    30
    31
    32
    33
    34
    35
     
    #ifndef CHAUFFAGE_H
    #define CHAUFFAGE_H
     
    #include <ctime>
     
    #include "consignes.h"
    #include "temperatures.h"
    #include "filtre.h"
    #include "relais.h"
     
    class Chauffage
    {
     
    public:
        Chauffage();
     
        bool gifChauffage = false;
     
        bool gifVentilationChauffage = false;
        bool gifVentilationIntChauffage = false;
        bool gifVentilationExtChauffage = false;
        bool gifVentilationDegChauffage = false;
     
        bool gifDegivrageChauffage = false;
        bool gifElectriqueChauffage = false;
        bool gifEgouttageChauffage = false;
     
        bool degivrageChauffage = false;
     
        bool passeEnModeFroidEnChauffage = false;
     
        void modeChauffage();
     
        void etatArretChauffage();
    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
     
    #include "chauffage.h"
     
    #include <QDebug>
     
    Chauffage::Chauffage()
    {
        qDebug() << "Chauffage";
     
        m_chauffageConsignes = new Consignes(QString("settings/consignes.ini"), QSettings::IniFormat);
     
        m_chauffageTemperatures = new Temperatures(QString("settings/temperatures.ini"), QSettings::IniFormat);
     
        m_chauffageFiltre = new Filtre(QString("settings/filtre.ini"), QSettings::IniFormat);
    }
     
    void Chauffage::etatMarcheChauffage()
    {
        //Froid::passeEnModeChauffage = false;
        m_chauffageRelais.activeRelaiEteHiver();
        departTempoVoletsCh = time(NULL);
        transitionGainableChauffage = TEMPO_VOLETS_CHAUFFAGE;
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 471
    Par défaut
    Bonjour,

    Le booléen passeEnModeChauffage est déjà public, donc tu peux le modifier directement depuis les méthodes d'une autre classe ou même depuis une fonction ordinaire hors classe. Il te faut simplement une référence vers l'instance de la classe « Froid » dont tu veux modifier cette propriété.

    À la ligne 19 de ton dernier exemple, cependant, tu essaies de la modifier justement sans avoir d'objet « Froid » visible. Ce serait possible (avec la syntaxe que tu as écrite) si ta propriété était déclarée static mais il y a 99,9 % de chances que ce ne soit pas du tout ce que tu cherches à faire en réalité. Donc, ne suis pas cette voie pour le moment.

    Il s'agit visiblement d'un problème de conception initiale. À quoi sont censées correspondre les classes « Froid » et « Chauffage » en premier lieu ?

    ---

    Par ailleurs : je constate que tu as masqué toutes les déclarations des membres privés de tes classes. Or, tu sembles construire tous ces membres privés avec new dans tes constructeurs alors que tu n'utilises jamais de destructeur. Tout cela ressemble à du code Java transposé. Ce n'est pas de cette manière qu'il faut construire tes objets car tu induis de grosses fuites de mémoire dans ton programme. new ne fonctionne pas de la même façon en C++ et en Java, et en principe, tu ne devrais même pas avoir à y recourir si les membres de ta classe doivent vivre aussi longtemps que l'objet lui-même.

  3. #3
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 33
    Par défaut
    En fait, j'ai essayé avec #include Froid.h".

    Froid m_chauffageFroid dans le .h et m_chauffageFroid.passeEnModeChauffage = false; a la ligne 19 mais cela ne marche pas

    En fait, je veux passer du froid au chauffage en automatique avec l'aide du bool passeEnModeChauffageJ'ai une class gainable qui gère le mode normal et les 3 autres modes « canicule », « chauffage » et « froid » passent grâce au bool pour changer de mode , mais je veux remettre le bool passeEnModeChauffage à false dans la class Chauffage et je n'arrive pas en sachant que j'utilise QTcreator QThread.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 471
    Par défaut
    Citation Envoyé par ludoiphone Voir le message
    … et m_chauffageFroid.passeEnModeChauffage = false; a la ligne 19 mais cela ne marche pas
    Si ça ne marche pas, il faut essayer de comprendre pourquoi (et lire les messages d'avertissement du compilateur, même si C++ est souvent un peu trop volubile de ce côté).

    Es-tu sûr que tu as bien déclaré m_chauffageFroid dans la section public de ta classe Froid ? Rien n'est moins sûr puisque les autres en « m_… » n'en ont pas l'air. Et là encore, utilises-tu un destructeur dans ta classe pour éliminer en fin de vie ce que tu as alloué avec new ? new te renvoie un pointeur vers un objet construit en mémoire et il faut utiliser explicitement delete pour le libérer ensuite. Le C++ ne fonctionne pas comme Java sur ce point-là.

    Par ailleurs, de quelle classe-mère dérivent les classes Consignes, Temperatures et Filtre ? Il est possible que Qt cache le pointeur dans ce cas précis (pratique répandue mais à combattre), ce qui expliquerait les confusions ici.

    Il faut que tu nous donnes le code complet de Froid, *.h et *.c tel que tu as essayé de l'écrire, parce qu'il manque probablement des choses.

  5. #5
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 33
    Par défaut
    merci a toi , je un debutant a la matiere , j'apprend les classes avec Qt et c++ depuis peux et je sais pas encore m'en servir a la perfection .

    pour les destructeurs c'est une question que je me pose , car j'aimerai comprendre quand les mettres .

    lien code complet , j'aimerais avoir vos lumieres pour m'orienter dans la bonne direction

    je n'ai pas ajouter ceux que je veux faire dessus , (dans la classe Chauffage) .

    https://github.com/ludoiphone/QtGainable

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 485
    Par défaut
    La conception de vos classes me semble actuellement assez bancale.

    Je ne connais pas la source qui vous sert de cours d'apprentissage, mais j'ai peur qu'il soit d'assez piètre qualité.
    L'usage totalement abusifs des pointeurs nus m'interloque pour un code de "débutant".
    Vos classes me semblent particulièrement sensibles à l'aspect "encapsulation" de la conception objet (POO), or, ces champs publiques booléens comme "passeEnModeChauffage" etc..., me ne semble pas du tout adapté à la situation.
    (Mais du code en français, ça inhibe pas mal de mes automatismes de compréhension du code. )

    Pour moi, c'est des états internes à l'objet donc non directement accessible depuis du code "client" de l'objet.
    Il faut être capable de changer l'implémentation de la classe s'en avoir à changer le code qui utilise la classe.

    Il faut donc, au minimum, encapsuler la modification de ce champs par une fonction "accesseur" qui permettra de modifier comment fonctionne l'objet sans avoir à tout casser.

    Je pense que la notion d'encapsulation doit être revu pour que le code de vos classes soit plus "sûr".

    Ne faites pas l'erreur de vous faire imposer le design de vos classes par un Framework, même si c'est Qt. Quitte à distinguer les classes "métiers" qui modélisent la "réalité" des classes d'affichage/IHM géré par Qt.

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