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 :

[POO] conception des classes


Sujet :

C++

  1. #141
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ok d'accord j'ai très bien compris...
    D'un choc à l'autre, je ne peux pas conserver mes caméras (les paramètres dépendent aussi du choc... )
    Donc pas de migration!

    Je me pose deux questions:

    1) En ce qui concerne Camera et CFP, vaut-il mieux que je stocke la référence à choc, ou alors le pointeur sur un choc?
    Sachant qu'un choc peut avoir plusieurs caméras: est-il possible d'avoir plusieurs références sur le même objet?
    Si oui -> je vais utiliser une référence
    Sinon -> pointeur

    2) Si pointeur il y a, l'utisation d'un pointeur intelligent est-elle possible ici?

    Je crois que c'est une des dernières questions!

    Merci encore à Luc et à Miles

  2. #142
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    1) oui, c'est possible, mais il faut que la référence soit connue au moment de l'appel, donc par exemple s'ils sont construits à l'initialisation de la classe, ça ne va pas aller -> pointeur.
    2) pointeur intelligent oui, sachant que lorsque le dernier pointeur intelligent est détruit, la ressource partagée aussi. Ca veut dire aussi qu'il peut y avoir des cycles - genre choc qui référence des caméras qui référencent le choc -> weak_ptr pour casser la dépendance, mais attention, il faut qu'il y ait un shared_ptr quand même quelque part -

  3. #143
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Miles, j'ai parcouru tes tutos boost, ainsi que les std::auto_ptr de la FAQ. Et je me suis posé brutalement une question:

    Est-il possible de stocker dans choc un vector<CFP> ? Vu que j'ai besoin de plusieurs CFP? (CFP possèdent des méthodes virtuelles pures)
    En effet, un simple pointeur ne suffit plus.

  4. #144
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    pas un vecteur<CFP>, un vecteur<CFP*> peut-être, d'om l'intérêt des pointeurs intelligents. Mais il paraît que dans Boost, il y a des bestiaux pour ça aussi, mais je n'ai eu le temps de faire un tuto sur tout pour l'instant

  5. #145
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Question bête: Pourquoi un vector<CFP*> et pas un vector<CFP>?
    Je ne peux pas tout stocker directement dans Choc? C'est pas une bonne idée?

  6. #146
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    un vecteur de CFP, c'est un vecteur d'objets CFP, et comme ce sont des objets qu'on ne peut pas instancier, ça plantera.

  7. #147
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Miles
    un vecteur de CFP, c'est un vecteur d'objets CFP, et comme ce sont des objets qu'on ne peut pas instancier, ça plantera.
    +1
    Bon. Il me reste encore des progrès à faire...
    En tous cas, ta réponse est très claire. Merci!

  8. #148
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Hum, une question dans le même genre:

    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
    Class Choc
    {
    private:
        vector<CFP*> cfp;
        int numero_camera;
        string nom_composant 
    ....
    }
    
    class CFP
    {
    private:
        Camera camera; // OU Camera & camera ?
    ....
    }
    Sachant que pour un CFP, je n'ai qu'une camera? Je penche pour la première solution.

    Tu confirmes?

  9. #149
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est une caméra par composant ou par expérience ?

  10. #150
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Par composant

  11. #151
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Et un composant a toujours une seule caméra associée ? A ce moment, une instance de Camera comme tu l'as fait convient.

  12. #152
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Oui, en fait le double avantage que j'y voyais, c'est que :
    1) C'est réellement ce qui se passe : une caméra par composant:
    2) Lorqu'on détruit un CFP, il faut aussi détruire sa caméra associée.

    Je pense que tout ça doit se dérouler correctement, non?

  13. #153
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, ça doit pouvoir marcher

  14. #154
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Luc Hermitte
    Et pourquoi ne pas centraliser ces infos dans ton monde (le choc) ?

    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
    --------------------------------------------
    // Camera .h
    struct Choc; // déclaration en avant, nécessaire pour les dependances circulaires (FAQ)
    
    struct Camera {
        Camera(Choc & c);
    ...
    private:
        Choc      & getChoc()       {return m_choc; }
        Choc const& getChoc() const {return m_choc; }
        int getChocNum() const;
    
        Choc & m_choc; // référence => on ne change pas de contexte!
    }
    
    --------------------------------------------
    // Choc.h
    #include "Camera.h"
    struct Choc {
        int         getNum() const;
        std::string getComposant() const;
    ....
    private:
        int         m_numero;
        std::string m_composant;
        Camera      m_c1;
    };
    
    --------------------------------------------
    // Camera.cpp
    #include "Camera.h"
    #include "Choc.h"
    
    Camera::Camera(Choc & c) : m_choc(c) { ... }
    
    int Camera::getChocNum() const {
        return getChoc().getNum();
    }
    
    --------------------------------------------
    // Choc.cpp
    #include "Camera.h"
    #include "Choc.h"
    
    Choc::Choc(....) : m_c1(*this) { ... }
    Je me penche sur ce code de Luc Hermitte pour l'implémentation, bien que mon diagramme UML aie été modifié depuis.
    Je ne comprend pas tout parfaitement , en particulier la ligne en rouge?

    Le but est effectivement de récupérer l'instance de choc par référence, mais...

    Merci d'avance...

  15. #155
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On initialise la référence dans la liste d'initialisation - sinon ça ne marche plus -

  16. #156
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est le constructeur de Camera qui initialise la référence sur le choc (m_choc).

    Comme il s'agit d'une référence et non d'un pointeur, on ne peut pas la modifier après son initialisation.

    Et cette initialisation se fait dès l'instanciation de l'objet, avant même d'entrer dans le bloc du constructeur. Pour initialiser une référence, il faut donc nécessairement utiliser les listes d'initialisation des constructeurs.

    Voir la :
    http://c.developpez.com/faq/cpp/?pag...EUR_liste_init

    Est-ce que c'est bien ça qui te posait problème ?

  17. #157
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Yes! Merci beaucoup... D'autant plus que j'avais déjà lu cette FAQ, mais avec le temps j'ai oublié...
    Ca c'est fait!

    J'ai une autre question, plus "subtile":
    Admettons que j'ai plusieurs objets de type Camera.
    Dans ma classe Camera, j'ai une autre classe Donnees:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Camera  {
    public:
    	Camera(std::string);
    	~Camera();
    	convertionDLTemperature();
    	int getNumeroCamera();
    	void setNumeroCamera(int numero_cam);
    	void setCorrespondanceCameraNumero(std::string nom_cfp);
     
    private:
    	int numero_camera;
    	Donnees donnees;
    }
    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
    class Donnees
    {
    public:
    	Donnees();
    	~Donnees();
    	CImg <unsigned short> getImageIR();
    	CImgl <unsigned short> getFilmIR();
    	CImg <unsigned short> getImageVisible();
    	void setImageVisible(CImg <unsigned short>);
    	void importImageIR(int);
    	void importFilmIR();
     
    private:
    	CImgl <unsigned short> film_IR;
    	CImg <unsigned short> image_IR;
    	CImg <unsigned short> image_visible;
     
    }
    Donnees étant private dans Camera...

    Etant donné que c'est le constructeur de Camera qui appelle le constructeur de Donnees (en lui donnant le nom donnees), comment faire?
    1) Toutes les classes portent le même nom
    2) Si je leur donne des noms différents, comment un autre programmeur qui ne connait pas ces noms va faire pour travailler avec ces données?

    Faut-il encore que je concoive mon pb autrement?

  18. #158
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Comprend pas ta question, désolé.

  19. #159
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ok je vais reformuler:

    Si je crée plusieurs objets Camera (c'est le programme qui le fait), comment vais-je récupérer imageIR dans donnees?

    Ca doit maintenant te paraitre bete, mais c'est pas clair dans ma tête!

  20. #160
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ah, je crois que je vois. Ton objet Camera lit en fait les Donnees utiles à l'expérience. En fait, je pense plutôt que ce qu'il faudrait faire, c'est une espèce de singleton Camera qui contient en fait une instance par Camera et qui est capable de lire des Donnees et de les renvoyer, et c'est ce qui est renvoyé que tu utilises pour contruire ton objet dans la liste d'initialisation, et tu as dans ton CFP une instance de Donnees et non plus de Camera. Tu vois ce que je veux dire ?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/01/2010, 08h31
  2. [POO] d’encapsulation des classe
    Par amazircool dans le forum Langage
    Réponses: 6
    Dernier message: 17/09/2007, 18h33
  3. [POO] Héritage des classes
    Par mic79 dans le forum Langage
    Réponses: 27
    Dernier message: 09/03/2007, 20h02
  4. [POO] Organisation des classes PHP
    Par AsQuel dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2007, 09h09
  5. [POO] faire des classes en php
    Par gromit83 dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2006, 16h10

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