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 :

Répartir les traitements d'une classe vers d'autres classes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Par défaut Répartir les traitements d'une classe vers d'autres classes
    Bonjour,

    Je viens vers vous car j'ai un petit problème de passage de paramètre dans une méthode, et probablement aussi un petit problème de conception.

    Pour simplifier, disons j'ai une classe centrale "App" qui a de nombreux traitements à faire et qui est liée à mon Affichage (Ligne de commande, ou Graphique). Elle reçoit donc les évènements des vues.
    Etant donné qu'il y a tout un tas de traitements différents, la classe App instancie dans son constructeur plusieurs classes comme par exemple "CloudModule" pour séparer les traitements par "type".
    La classe CloudModule a elle-même pas mal de traitements à faire et instancie aussi dans son constructeur plusieurs classes comme par exemple "FileManager".

    La classe App est centrale, délègue un traitement à son module, qui déléguera aussi son traitement à un de ses Managers.
    Une classe module contient tous les attributs nécessaire pour les traitements (Buffer, entiers, ...).
    Les managers ont besoins des attributs du Module pour effectuer leurs traitements.

    Voici un petit diagramme de classe simplifié : http://i.imgur.com/ueKTZTV.png



    Mon problème se situe entre les "Modules" et les "Managers".
    Au début, je me suis dis que je passerais la référence du "Module" à chaque "Manager" en l'instanciant.
    Le Manager pourrait ensuite avoir accès aux attributs via la référence du module.

    Mais j’ai un problème en faisant ça, à la compilation : error: no matching function for call to 'FileManager::setModule(CloudModule* const)'


    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
     
        class CloudModule
        {
            public:
                CloudModule();
                virtual ~CloudModule();
     
            private:
                FileManager fileManager;
        };
     
     
     
        CloudModule::CloudModule()
        {
            this->fileManager = new FileManager();
     
            this->fileManager->setModule(this);
        }
    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
     
        class FileManager
        {
            public:
                FileManager();
                virtual ~FileManager();
     
                void setModule(CloudModule *);
     
            protected:
                CloudModule *module;
        };
     
     
     
        FileManager::FileManager()
        {
     
        }
     
        FileManager::~FileManager()
        {
     
        }
     
     
        void FileManager::setModule(CloudModule *aModule)
        {
            this->module = aModule;
        }




    J'ai essayé de jouer avec les 'const' dans les paramètres de ma méthode, mais j'arrive pas à passer 'this' non plus si je modifie le prototype de ma méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error: no matching function for call to 'FileManager::setModule(CloudModule* const)'
    note: candidate is:
    note: void FileManager::setModule(const CloudModule*)


    Du coup, je commence aussi à douter, au niveau conception, de la propreté de cette solution.
    Est-ce vraiment une bonne façon de répartir des traitements vers plusieurs autres classes ?

    Comment est-ce que je pourrais améliorer ce système ?


    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    Réponse vite-faite :
    1. Supprime tous les "this->": cela surcharge inutilement
    2. Le compilateur te dit ton erreur "FileManager::setModule(CloudModule* const)". Si je ne me trompe pas, tu passes this qui est constant alors que ton prototype lui dit "je peux modifier le paramètre". Donc essaye soit de mettre const dans le prototype si cela est possible soit de caster (le mieux c'est const_cast)

  3. #3
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    setModule est une méthode donc elle connais déjà this.
    Tu n'as peut être pas besoin de passer un paramètre ici ?

    Dans le code que tu donnes, il y a le constructeur de CloudModule et les déclarations de la classe FileManager.
    Du coup, on a pas le prototype de la méthode CloudModule::setModule (qui devrait être selon le code void setModule(CloudModule const *)).

    En tout cas, le const_cast est plus qu'à éviter.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    setModule est une méthode donc elle connais déjà this.
    Tu n'as peut être pas besoin de passer un paramètre ici ?

    Dans le code que tu donnes, il y a le constructeur de CloudModule et les déclarations de la classe FileManager.
    Du coup, on a pas le prototype de la méthode CloudModule::setModule

    J'ai modifié mon premier message pour compléter les balises codes, car tu as fais une petite erreur d'interprétation :
    La méthode setModule n'est pas dans la classe CloudModule, mais dans la classe FileManager (sinon effectivement, ça ne servirait à rien car CloudModule se connait elle-même ^^).
    => FileManager::setModule(CloudModule *)


    Citation Envoyé par Ehonn Voir le message
    qui devrait être selon le code void setModule(CloudModule const *)
    C'est la première chose que j'ai essayé quand je me suis aperçu que 'this' était constant, mais ça n'arrange pas les choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error: no matching function for call to 'FileManager::setModule(CloudModule* const)'
    note: candidate is:
    note: void FileManager::setModule(const CloudModule*)
    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
    class FileManager
        {
            public:
                FileManager();
                virtual ~FileManager();
     
                void setModule(CloudModule const *);
     
            protected:
                CloudModule const *module;
        };
     
     
     
        FileManager::FileManager()
        {
     
        }
     
        FileManager::~FileManager()
        {
     
        }
     
     
        void FileManager::setModule(CloudModule const *aModule)
        {
            this->module = aModule;
        }


    Sinon, en dehors de ce problème de 'const', est-ce une bonne idée de passer des références de 'this' dans ce cas là ?
    Est-ce qu'il existe des solutions plus efficace/plus propres pour répartir ?

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par foetus Voir le message
    (le mieux c'est const_cast)
    Pour le reste de ta réponse on est d'accord.
    Mais on utilise un const_cast quand une erreur de const-correctness à été commise dans du code que l'on doit utiliser mais que l'on ne peut pas corriger.
    (Normalement avec le mot clef mutable, il n'y à pas d'autre utilisation possible de const_cast).

    Par exemple une ancienne lib C qui prend un char* au lieu d'un const char* en paramètre. (Ou cas similaire).

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Mais on utilise un const_cast quand une erreur de const-correctness à été commise dans du code que l'on doit utiliser mais que l'on ne peut pas corriger.
    (Normalement avec le mot clef mutable, il n'y à pas d'autre utilisation possible de const_cast).
    Pour moi, le const_cast remplace le cast "à la C" pour un usage spécifique (retirer l'état contant) avec une syntaxe (comme les 2-3 autres cast C++) qui te surcharge ton code afin d'alerter le développeur: "Soit tu mets trop de const, soit tes const sont mal faits, soit il y a un truc qui cloche"

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 150
    Billets dans le blog
    4
    Par défaut
    C'est vraiment là ton seul code et c'est bien CE setModule qui plante ? impossible.
    Il n'y a aucune raison de planter, dans le contstructeur, this n'est pas const
    D'ailleurs ce code compile parfaitement, moyennant l'ajout du * dans la déclaration du membre fileManager de CloudModule.
    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.

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par foetus Voir le message
    Pour moi, le const_cast remplace le cast "à la C" pour un usage spécifique (retirer l'état contant) avec une syntaxe (comme les 2-3 autres cast C++) qui te surcharge ton code afin d'alerter le développeur: "Soit tu mets trop de const, soit tes const sont mal faits, soit il y a un truc qui cloche"
    Oui un const_cast remplace les cast "style C", tout comme static_cast ou reinterpret_cast (dynamic_cast est différent).

    Mais dans les cas d'utilisation que tu donne "Soit tu mets trop de const" est faux, ça devrait plutôt être "Il manque un const quelque part".

  9. #9
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    FileManager::setModule(CloudModule * const) et FileManager::setModule(CloudModule const *) sont différents.
    Dans le premier, on a pas le droit de modifier le pointeur, dans le deuxième on a pas le droit de modifier l'objet pointé.
    (L'utilisation d'une référence permet de ne pas faire ce genre d'erreur).

Discussions similaires

  1. [XL-97] Copier les données d'une classeur vers 2 autres
    Par XstephaniemartinX dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/02/2014, 10h48
  2. [JSP]Exporter les données d'une table vers un CSV
    Par genuine dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 25/10/2006, 10h58
  3. Réponses: 4
    Dernier message: 25/08/2006, 00h25
  4. Réponses: 5
    Dernier message: 12/08/2006, 00h36
  5. Transférer les données d'une JTable vers une autre
    Par rollbich dans le forum Composants
    Réponses: 4
    Dernier message: 19/01/2006, 23h22

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