T'y es presque! Camera ECRIT dans données. Ce sont des données de sortie pour une analyse future qui n'est pas encore faite! :D
Ces données sont destinées à etre utilisées par la suite!
Version imprimable
T'y es presque! Camera ECRIT dans données. Ce sont des données de sortie pour une analyse future qui n'est pas encore faite! :D
Ces données sont destinées à etre utilisées par la suite!
Ah :koi: Donnees ne contient donc pas les données que le composant va "analyser" ?
Ben non !!!! ;)
Mais je dois peut etre me débrouiller autrement !
Tu m'avais conseillé de créer une classe Données il y a quelques jours dans ce topic pour ça! :mrgreen:
Ah, OK, donc j'ai rien compris... Je croyais que la caméra donnait au composant des données et que l'expérience travaillait ensuite sur ces données.
C'était ton idée à la base, que je n'ai fait que copier. J'espère ne pas l'avoir interprétée de travers...:mrgreen:
Mon problème est donc celui-là: je crée à partir de Camera des Donnees. Problème: la classe porte toujours le même nom...
Je crois que mon problème est débile, mais j'arrive pas à en voir le bout:
Récapitulatif:
1) J'ai un CFP qui contient une Camera, qui elle-même contient des Données (le tout par composition). (si tu veux je peux joindre le nouveau schéma)...
2) Je voudrai accéder aux Donnees. Comment faire? EN passant par CFP?
Oui, en passant par CFP.
Mais si c'est mon idée, en tout cas, je ne vois pas laquelle :D
http://www.developpez.net/forums/sho...&postcount=130
Mais je suis pas sur que c'est ce que tu voulais dire !!!! :mrgreen: :mrgreen:
OK, c'est bien ce que je pensais ;)
En fait, je t'ai posé la question avant, pour vérifier ça, mais ta réponse ne me donnait pas la bonne solution.
Les caméras devraient être indépendantes de tout, une classe singleton/registry qui retournent des données quand on les appelle et ces données sont stockées dans les CFP.
Mais la réponse que tu m'avais donnée m'indiquait que ces données étaient générées par le CFP, ou alors on s'est mal compris. En fait, on s'est mal compris :D
Pourtant, ce schéma est très intéressant: la caméra ne vit pas sa propre vie, puisque je la met dans CFP, mais cette vision a les deux avantages ci-dessus.Citation:
Envoyé par poukill
Tu penses que je devrai mettre ma caméra indépendante? (plus réel, moins pratique?)
Ou alors la remettre comme précédemment dans Choc?
Sinon j'avais pensé à stocker à la fois un CFP avec sa camera associé dans un std::pair, vu qu'ils vont bien ensemble! Je pense que c'est une idée pas trop mauvaise, mais de là à voir tous les enjeux qu'il y a derrière, je m'écclipse complet là ;)
Pour info:
Agrandir l'image pour y voir quelque chose...
Un tout autre problème...
Je suis désolé d'enchainer les questions, mais j'ai l'impression d'enchainer les problèmes... Sur un gros projet tout seul, c'est pas facile du tout....:cry:
Merci encore en tous cas pour la patience...
J'ai bien compris (enfin!) le bout de code de Luc pour le passage par référence du Choc pour "remonter à la source".
L'exemple, très parlant dans le cas d'une composition (avec Camera ici), peut-il être appilqué à un CFP* ?
Exemple:
Code:
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 #ifndef CHOC_H #define CHOC_H #include "CImg.h" #include <iostream> #include <string> #include "cfp.h" // dépendance circulaire class Choc { public: Choc (int num_choc, std::string nom_cfp); ~Choc(); void ajouterComposant(std::string); void supprimerComposant(std::string); private: std::vector<CFP*> tableau_cfp; int numero_choc; std::string nom_composant; } #endif
Le problème, c'est que je ne peux pas faire quelquechose comme :Code:
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 class Choc; // déclaration en avant, nécessaire pour les dependances circulaires class CFP { public: CFP(Choc & c); ~CFP(); CImg <unsigned short> getImageIR(); virtual setImageIR(CImg <unsigned short>) = 0; CImg <unsigned short> getImageVisible(); void setImageVisible(); virtual setZone(int) = 0; int getZone(); ajusterTailleVisibleEtIR(); private: CImg <unsigned short> image_IR_ref; CImg <unsigned short> image_visible; int zone; 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! }
Est-ce que je peux créer un CFP* via un new, comme ça:Code:Choc::Choc(....) : cfp(*this) { ... }
Je n'ai vraiment aucunes idées si ce truc marche ... ;)Code:
1
2
3 CFP * comp = new CFP(*this); cfp.push_back(comp);
C'est une caméra qui doit être détruite ou les données qu'elle a acquise ?Citation:
Envoyé par poukill
Tout ! Si l'utilisateur décide de changer de composant à regarder, il faut tout supprimer ! :D
Bon, dans ce cas, autant garder les données dans la caméra...
OK je trouve ça logique aussi Miles!
Et en ce qui concerne mon message #171 ???
C'est un gros point qui bloque pour moi ! Car j'aimerai bien avoir une référence à Choc dans ma classe CFP Camera, mais je sais pas trop comment m'y prendre! (cf 171)
Merci d'avance ! :D
Oui, tu peux sauf que new CFP(...) va planter ;)
Les vecteurs nécessitent que les objets stockés soient copiables.Citation:
Envoyé par poukill
Or tes CFP font parti d'une hierarchie d'objets polymorphes (si j'ai bien suivi). Sans feinte explicite, tu ne peut pas avoir de sémantique de copie sur les objets d'une hiérarchie polymorphes. Le défaut tend vers une sémantique d'entité avec parfois la "clonabilité".
Soit, pas de CFP dans des vecteurs. Qu'ils soient ou non instanciables.
Il ne faut pas avoir peur d'écrire plein de petites classes aux rôles bien spécialisés et aux noms qui retranscrivent bien ces rôles.
Promis, je prendrais le temps de me pencher sur ton diagramme, et de relire l'emsenble de tes specs ;)
choc.h
choc.cppCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 class Choc { public: Choc (int num_choc, std::string nom_cfp); ~Choc(); void ajouterComposant(std::string); void supprimerComposant(std::string); private: std::vector<CFP*> tableau_cfp; int numero_choc; }
Là Miles, je vois pas du tout: comment passer la référence à choc, lorsqu'on est pas dans la liste d'initialisation?8OCode:
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 Choc::Choc(int num_choc) :numero_choc(num_choc) { std::cout << "Choc numero " << numero_choc << "cree" <<std::endl ; ajouterComposant(nom_cfp); } Choc::~Choc() { std::cout << "Choc détruit"<< std::endl; } void Choc::setNumeroChoc(int nchoc) { numero_choc = nchoc; } void ajouterComposant(std::string nom_cfp) { CFP *cfp = new CFP(numero_choc, nom_cfp); // manque une ref à ce Choc! tableau_cfp.push_back(cfp); } void supprimerComposant(std::string nom_cfp) { for (int i=0; i<tableau_cfp.size(); i++) { if (tableau_cfp[i]->getNomComposant() == nom_cfp) { tableau_cfp[i] = NULL; } } }
Merci Luc pour le tuyau!Citation:
Envoyé par Luc Hermitte
Je suppose qu'il en va de même avec des std::list ???
Donc il faudrait que j'utilise un tableau de CFP* ?
Je ne comprend pas ton problème. le numéro de choc a bien été initialisé pourtant ??Citation:
Envoyé par poukill
Par contre, je suppose qu'il s'agit d'une faute de frappe, mais le prototype de ton constructeur dans choc.cpp n'est pas le même que dans choc.h (il manque std::string nom_cfp)
Un oubli, j'arrete pas de tout modifier tout le temps... Merci ;)Citation:
Envoyé par Eusebe
C'est pas le numero de choc le pb...Citation:
Je ne comprend pas ton problème. le numéro de choc a bien été initialisé pourtant ??
Le problème, c'est qu'il faut que je donne au constructeur de cfp une référence au choc qui lui correspond.
Tu me suis ? :mrgreen:
du genre :
Mais comment lui donner cette instance?8OCode:CFP (&Choc, .....)
Ah ok, je n'avais pas en tête le prototype du constructeur de cfp ;)
Tu as essayé avec *this ?
Mais je ne suis pas sûr du tout que ça fonctionne, puisque ton objet n'est pas encore complètement créé...
Je ne pense pas que ça marche *this... C'est ce que Luc me proposait dans son code trois pages avant. Mais là c'était une composition, pas un pointeur.
Pour moi, *this ne marche que dans la liste d'initialisation...:cry:
Mais je ne suis pas si sur...
Je reste preneur d'idées en tous cas! :D
*this n'existe pas dans la liste d'initialisation d'une classe. Ca existe à partir du moment où la classe est crée.Citation:
Envoyé par poukill
Au temps pour moi: c'est une bonne nouvelle Miles! :D
Au fait Miles, pourquoi ça va planter?8OCitation:
Envoyé par Miles
Code:CFP *cfp = new CFP(*this, nom_cfp);
Parce que CFP a des méthodes virtuelles pures.
Oups :aie:
Bon, je suis mal barré là.
Je croyais que les pointeurs permettaient le polymorphisme.
CFP ne peux pas etre instancié, mais elle ne peut pas avoir de pointeur qui lui pointe dessus alors?
Une solution ? :(
Ben, si CFP possède des méthodes virtuelles pures, c'est donc une classe abstraite: Elle n'est pas supposée être instanciée.
Par contre, une classe abstraite est supposée avoir des classes dérivées, qui elles, peuvent être instanciées.
Généralement, on utilise le pointeur de classe abstraite pour pointer sur une instance de la classe dérivée.
Si CFP est une classe abstraite, c'est que tu ne devrais pas avoir besoin de la créer directement.
Est-ce que tu ne peux pas dans ton choc créer un objet d'une classe héritée de CFP ?
of course !Citation:
Envoyé par Médinoc
Oui, j'ai souvent vu ça, donc je voulais faire pareil, mais j'ai pris le problème à l'envers...Citation:
Par contre, une classe abstraite est supposée avoir des classes dérivées, qui elles, peuvent être instanciées.
Généralement, on utilise le pointeur de classe abstraite pour pointer sur une instance de la classe dérivée.
Je voulais éviter, mais je n'ai pas le choix. Je vais donc partir là dessus!Citation:
Envoyé par Eusebe
Merci à vous! :D
Deux petites questions:
1) Le construteur d'une classe fille peut-il appeler le constructeur de la classe mère abstraite?
exemple:
2) Concernant le message de Luc sur mes vector: quelle solution adopter:Code:
1
2
3
4
5 Antenne::Antenne( Choc &c, std::string nom_cfp) :CFP(c, nom_cfp) { // bla bla bla }
a) Prendre un autre conteneur (liste ?)
b) Utiliser un new/ delete[] (passage par pointeur)
Merci encore (et encore...) pour vos réponses!:roi:
- oui.
- b) (mais sans les crochets : utilise une liste de pointeurs, voire de boost::shared_ptr)
OK Merci Médinoc.
1) C'est quand même bizarre: une classe abstraite ne peut etre instancié, mais possède quand même un constructeur... No comment!
2) Hum.. Du côté de boost, pourquoi pas?
Je vais me renseigner un peu plus sur boost::shared_ptr
1) ben non, c'est logique, il peut y avoir des variables membres à initialiser.
Une autre question de débutant:
Comment faire pour stocker l'instance d'une classe dans une variable?
J'illustre mon problème dans l'exemple suivant:
Code:
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 class CFP { public: CFP(Choc & c, std::string nom_cfp); ~CFP(); CImg <unsigned short> getImageIR(); virtual setImageIR(CImg <unsigned short>) = 0; CImg <unsigned short> getImageVisible(); void setImageVisible(); virtual setZone(int) = 0; int getZone(); void ajusterTailleVisibleEtIR(); std::string getNomComposant(); private: Camera camera; CImg <unsigned short> image_IR_ref; CImg <unsigned short> image_visible; std::string nom_composant; int zone; 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! }
J'appelle effectivement le constructeur, mais comment stocker l'instance dans ma variable privé qui m'intéresse.Code:
1
2
3
4
5
6
7
8
9
10 CFP::CFP(Choc & c, std::string nom_cfp) : m_choc(c), nom_composant(nom_cfp), Camera(c, nom_cfp) { std::cout << "Creation d'un objet CFP"<< std::endl; zone = 0; setImageVisible(); setImageIR(); ajusterTailleVisibleEtIR(); }
Intuitivement, j'avais pensé à, mais je me méfie de mes intuitions parfois!Code:camera (Camera(c, nom_cfp))
Merci!
camera(...), comme pour tout constructeur d'une variable.
Au temps pour moi... :oops:
Je sais, je suis loin d'être au top, mais ça viendra un jour...
Dans la mesure du possible, je souhaiterai utiliser boost::shared_ptr.
Je viens de regarder le tuto de Miles: http://miles.developpez.com/tutoriel...martptrs/#LIII
J'avoue ne pas avoir tout compris :oops:
Quel est l'avantage d'un tableau de boost::shared_ptr? Comment ça s'utilise? (je suis un peu noyé dans les constructeurs!)
tu as un std::vector<boost::shared_ptr<CFP> > vecteurCFP et pour initialiser un élément, tu fais un vecteurCFP[i].reset(new machin(...)); ou un vecteurCFP[i] = boost::shared_ptr<CFP>(new machin(...));