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 :

Observer : renvoi du type d'objet


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut Observer : renvoi du type d'objet
    Bonjour à tous,

    Je m'intéresse depuis peu aux design patterns et de tous les bénéfices que cela peut apporter. Je m'intéresse donc, dans un premier temps, au pattern "Observer" qui me semble être une base particulièrement utile dans mes différents projets.

    Pour le moment, tout va bien. J'ai compris le fonctionnement (relativement simple) et suis capable de le mettre en œuvre sur des sujets simples. Cependant, je me demandais comment mettre en place un tel type de pattern dans le cas où on se retrouve avec un grand nombre de valeurs à passer.

    Par exemple, je peux avoir un Transmetteur "Clavier" qui comme son nom l'indique envoi une notification à ses récepteurs en incluant les touches pressées. A côté de ça, un autre transmetteur "Souris" qui notifie ses récepteurs de l'état de ses boutons etc... Jusqu'à lors, ce que j'arrive à faire se limite à un seul évènement.

    Comment puis-je faire pour qu'un récepteur accepte via une fonction unique n'importe quel type de données ? J'ai bien tenté de renvoyer au récepteur un pointeur sur le transmetteur, mais étant donné que mes classes Transmetteur et Recepteur sont virtuelles le compilateur m'envoie gentiment valser dans tous les coins.



    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
    class Sensor: public Transmitter
    {
    private:
    	int _data;
     
    public:
    	Sensor(): _data(0) {}
    	virtual ~Sensor() {}
     
    	virtual void setData(const int &i) { _data = i; update(); }
    	virtual int getData() { return _data; }
     
    };
     
    class Machine: public Receiver
    {
    public:
    	Machine() { }
    	~Machine() { }
     
    	virtual bool notify() { std::cout << "notified val : " << std::endl; return true; }
    	virtual bool notify(vx::SmartPtr<Transmitter> T) { std::cout << "notified val : "<< (*T).getData() << std::endl; return true; }
    };

    retour du compilo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    In member function 'virtual bool Machine::notify(vx::SmartPtr<Transmitter>)':|
    error: 'class Transmitter' has no member named 'getData'|


    Merci d'avance pour vos retours.

  2. #2
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Bon, J'ai compris. Je dois mettre la fonction "getData()" dans la classe virtuelle..... Mais j'ai peur que ce soit trop permissif du coup... Une idée plus intelligente ?

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    J'avais pondu cette preuve de concept il y a pas mal de temps. En inversant les relations, on arrive à typer fortement le pattern.

    Du coup c'est plus complexe à comprendre car moins usuel comme façon de de faire.

    https://gist.github.com/LucHermitte/...ab6a8c9ccafbf4

    A voir si les notions de signaux, ou si juste les lambdas ne pourraient pas simplifier les choses. J'avoue ne plus y avoir réfléchi depuis le temps.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Merci pour ce retour ; je vais voir comment ceci est réalisé... Je pense, en parallèle, que je dois me familiariser un peu plus avec les notions de classes virtuelles / virtuelles pures etc...
    En réalité, le simple aspect "Orienté Objet" d'un langage (du c++ en tout cas) apporte tout un lot de fonctionnalités bien plus poussé que ce que l'on peux s'imaginer aux premiers abords.

    Merci.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    > classe virtuelle

    Ca n'existe pas. Une classe de base peut être virtuelle relativement à un héritage précis, mais aussi non virtuelle sur un autre héritage.

    Je pense que tu confonds avec la notion de classe abstraite. Si tu galères avec l'OO, il y a de fortes chances qu'il ne te soit pas présenté correctement -- un grand classique malheureusement.

    Les fonctions virtuelles viennent enrichir la notion de substituabilité en raffinant comment un point de variation doit se comporter. Mes mots sont probablement barbares et je n'ai pas trop le temps de les détailler. Il y a un livre que j'aime bien, pas orienté C++ mais OSEF: Design Patterns, tête la première. Il montre bien comment l'OO est employé pour répondre à des besoins.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Effectivement, je parlais bien de "classe abstraite" ; merci pour cette précision.

    Je suis d'accord avec toi, j'apprends de manière strictement autodidacte selon toute la diversité que propose internet. Peut-être que le passage via un livre dédié accélérerais considérablement mon apprentissage ? à voir. Je vais regarder du côté de l'ouvrage que tu mentionnes. Comme tu le dis, pour le moment, il s'agit surtout de l'aspect "Orienté Objet" que je dois travailler. Les côtés techniques de l'implémentation dans un langage ou un autre seront abordés par la suite (et/ou en parallèle d'ailleurs).

    Merci pour ces conseils.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2019, 18h52
  2. [XL-2013] Code qui renvoie le Type d'Objet dans un UserForm qui a le focus
    Par pickatshou dans le forum Excel
    Réponses: 5
    Dernier message: 16/07/2015, 20h35
  3. Quel type d'objet renvoie Workbooks(nomFichier).Worksheets(1)?
    Par netoale dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/03/2011, 11h50
  4. Initialisation d'un type d'objet
    Par fdraven dans le forum Oracle
    Réponses: 3
    Dernier message: 28/10/2005, 11h05
  5. [Appli] Recherche d'un type d'objet précis pour interface
    Par superpatate dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 05/08/2005, 12h02

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