Non, sauf si tu prévois un pointeur pour "remonter". Et attention, tu stockes un pointeur vers CFP, pas une instance directement ;)
Version imprimable
Non, sauf si tu prévois un pointeur pour "remonter". Et attention, tu stockes un pointeur vers CFP, pas une instance directement ;)
AAAH ok.
On stocke un pointeur et pas une instance? Pourquoi?
Là du coup je vais devoir créer un max de méthode dans Choc pour remplir mes champs de CFP !:aie:
Quand on stocke un pointeur comme ça, quels sont les droits d'accès (private, protected, public) vers là ou on pointe ? :D
Tu ne pourras pas stocker une instance de CFP puisqu'en tant que telle, elle n'existe pas, c'est un composant abstrait, c'est l'antenne qui sera quelque chose, et pour accéder à une antenne à travers un CFP, il va te falloir un pointeur.
Ok d'accord, je commence à comprendre ! :D
1) Dans l'hypothèse où CFG serait seul, sans classes filles. Pourrait-on stocker directement l'instance dans choc ?
2)Donc, on ne peut pas créer d'objet CFP? Il faudra passer obligatoirement par les classes filles (j'ai fait un peu de java avant donc... c'est un peu différent je pense) ?Citation:
c'est l'antenne qui sera quelque chose
3) Vu que CFP est une classe abstraite, faut-il la déclarer comme abstract (comme en java)?
Merci bcp bcp pour ton aide ! :D
1) oui
2) Exact, comme en Java, on ne peut pas créer de classe dont une fonction est virtuelle pure/abstraite
3) non, ce sont les méthodes qui sont virtuelles pures.
OK d'accord! De fils en aiguilles, je progresse !:D
Ce sont donc les méthodes à déclarer comme virtuelles pures. Lorsqu'on les déclare comme telles, faut-il leur donner une implémentation? i.e on déclare quand même les méthodes, et la méthode fille appelle la méthode mère ?
Comment ça se passe en C++?
Virtuelles pures = virtuelles pures, s'il y a une implémentation, elles sont virtuelles.
Si tu veux appeler la méthode mère, c'est ton choix.
Au fait, pourquoi implémenter des méthodes virtuelles pures? :oops:
Ne peut-on pas déclarer les fonctions membres normalement?
Elles doivent au moins être virtuelles si tu veux appeler les fonctions de la classe fille àç partir de la classe mère, mais pour ça, je te conseille d'aller voir la FAQ ;) http://c.developpez.com/faq/cpp/?pag...LASS_abstraite
Pour moi, de la classe mère dérive deux classes : LPT et Antenne. La classe mère (CFP) va définir un ensemble de méthodes, certaines reprises par les classes filles.
Effectivement, comme dans la FAQ, il est possible (mais pas encore sur!) que certaines fonctions bien différentes pour CFP et Antenne, aient besoin d'une redéfinition! -> Dans ce cas, méthode virtuelle pure ?
Question : si on définit une méthode calculer() dans CFP, est-ce qu'on peut modifier cette fonction? i.e donner une nouvelle implémenation sans changer les arguments? Peut-on surchager cette fonction ?
Ca fait bcp de questions! :mrgreen:
Merci... ;)
C'est sûr, tu auras des méthodes dans CFP qui seront génériques aux CFP, mais les autres, qui sont des particularités des 2 composants - je ne sais pas, par ex la température de je ne sais quoi -, seront des fonctions virtuelles pures dans la classe mère.
Si tu as une fonction dans CFP qui s'appelle calculer, tu peux redéfinir cette fonction dans la classe fille, mais si elle n'est pas virtuelle dans la classe mère, elle ne sera jamais appelée. Si tu surcharges la fonctiond ans la classe fille, c'est une autre fonction, il te faudra tout de même définir la première.
A ce sujet, j'ai lu la FAQCitation:
Envoyé par Miles
http://c.developpez.com/faq/cpp/?pag...NITION_virtual
Mais je dois avouer que j'ai pas tout compris... Le virtual permet d'appeler la fonction dans la classe fille, sinon c'est la fonction "mère" qui est appelée c'est ça ??? :aie:
Tu as un pointeur de type Mere* que tu as rempli avec un new Fille();
Si tu accèdes aux méthodes déclarées dans Mere - les seules pouvant être appelées puisque tu as un pointeur de type Mere* - sans qu'elles soient virtuelles, tu appelles les fonctions de la classe mère, tu n'as aucun moyen d'accéder à la classe fille. E revanche, si les fonctions sont virtuelles, tu accèdera aux fonctions de la classe fille.
Salut !
OK j'ai bien compris... De plus, je viens de potasser un bouquin de C++ là dessus, j'y vois plus clair!
Par contre, voici une question plus embetante pour moi: ;)
Pour implémenter une fonction du genre "is_readable (std::string &file)", comme celà est fait dans la FAQ, faut-il créer une classe fichier (pour rester dans l'esprit de la POO), ou bien alors le laisser comme une fonction, et donc créer un fichier outils.cpp où tous ces petits test seront implémentés (moins propre ???) :D
Merci !
Les 2 se défendent, mais je préfèrerais les fonctions libres qu'une classe :)
OK super, je vais donc pas le mettre dans une classe, j'ai déjà assez de problèmes avec le reste!
Il faut bien le dire, je suis bientôt près de la solution, mais j'hésite encore sur l'architecture globale de mon programme!
Voici où j'en suis (pièce jointe).
Ma question est la suivante:
litCorrespondanceCameraNumero() a besoin de deux paramètres pour fonctionner : nom_composant, et fichier_camera_numero. Elle doit remplir le champ numero_cam dans la classe Camera.
Est-ce possible d'effectuer cette opération avec ce schéma là?:D
Je n'ai pas trop d'idée comment remplir, c'est à dire comment accéder aux variables des autres classes proprement(peut-être par amitié ?)
Merci beaucoup: ;)
Une série de set/get ?
Oui, mais les variables ne sont pas dans la classe ? Je ne peux donc pas faire un simple get ? (cf pièce jointe)
Ma question est donc : comment accéder aux classes par composition? L'amitié est - elle dans mon cas un bon moyen (cf schéma ?)
Tu me parlais de pointeurs pour "remonter" ?
Voici un exemple concret de mon problème :
En rouge sur le schéma de la pièce jointe, une fonction get qui doit aller chercher une variable dans une autre classe: la classe CFP.
Est-ce que la déclaration friend est bien adaptée?
Merci Miles! :D
Attends, qu'est-ce que tu fais ? C'est dans Choc qu'il y a la fonctionq ue tu veux appeler, non ? Pourquoi ne peut-elle pas chercher dans ses variables CFP les données que tu veux ?
OULLAAAAAAAAAAAAAAAAAAA
Merci Miles, j'étais en train de faire n'importe quoi....:aie:
Je suis en train de me prendre la tete avec cette conception...:oops:
Je n'ai pas besoin de fonction friend
En fait, j'ai besoin dans la classe Camera de la variable zone, qui se trouve dans la classe CFP
J'ai juste à faire cfp.getZone() (il suffit d'implémenter correctement la méthode dans la classe CFP)
OK j'ai corrigé mes bourdes....
Je vais commencer à implémenter mes classes suivant le schéma en pièce jointe...
Je suis toujours preneur de remarques!!!!:D
Question importante :
Comment accéder aux méthodes de la classe Choc depuis une autre classe, sans savoir le nom de l'objet Choc? 8O
C'est à dire, j'aimerais bien faire:
Mais à vrai dire, je suis pas sur du tout que l'instance de la classe Choc va s'appeler choc, car je ne suis pas forcément l'auteur du main!:DCode:choc.getNumeroChoc()
C'est à dire
Là je vois pas :mur:Code:
1
2
3
4 int main() { Choc choc; // etc. }
Tu as absolument besoin de connaître ça ? Tu ne peux pas récupérer les données à l'appel de la fonction ou au retour ? Les dépendances cycliques, c'est aussi bof :|
Il faut que j'accède au numéro du choc depuis Camera...Citation:
Envoyé par Miles
Camera.h:
Choc.h:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 class Camera { public: Camera(); ~Camera(); initialisation(); convertionDLTemperature(); int getNumeroCamera(); setNumeroCamera(int numero_cam); private: int numero_camera; }
L'initialisation a besoin de numero_choc !!!! ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Choc { public: Choc (int num_choc); ~Choc(); CImg <unsigned short> importImage (int num_image); void setCorrespondanceCameraNumero(); void setNumeroChoc(int nchoc); int getNumeroChoc(); private: CFP *cfp; int numero_choc; Camera camera; }
Donc soit j'ai mal designé la chose, soit il y a un moyen (pointeur pour remonter la composition ?):D
Où est-ce que la camera a besoin du numero_choc ? Et si c'est à la construction que ça se décide, pourquoi une méthode initialisation - beurk - quand c'est en fait une affectation qui est faite en réalité et qu'on peut donner en paramètre au constructeur ?
En fait, le numero_choc, c'est la donnée importante du programme tout entier, c'est à partir de ça que l'on peut faire l'initialisation de la Camera...Citation:
Envoyé par Miles
Je suis encore débutant en POO :oops:Citation:
Envoyé par Miles
Il serait donc préférable d'avoir une méthode créerCaméra dans la classe Choc, ainsi on connait le numero_choc; il ne reste donc plus qu'à intégrer le numéro_choc dans le constructeur, et ainsi virer initialisation() ?
Merci Miles pour ton soutien:)
La caméra est unique par instance de Choc ?
Normalement, la caméra est crée à l'initialisation de la classe Choc.
Oui, je ne crée qu'une seule caméra par choc !
Donc, dans le constructeur de choc, j'appelle une méthode qui va appeler le constructeur de caméra, avec comme paramètre numero_choc ?
Non, tu crées ta caméra dans la liste d'initialisation, comme ça devrait se faire normalement.
Oui, bien sur. J'avoue avoir du mal à cerner mon projet dans l'intégralité.
En ce moment, je rencontre un problème assez difficile à expliquer. J'espère être au maximum compréhensible:
Etant donné que mes classes ont un peu besoin les unes des autres, comment doit s'implémenter le constructeur de Choc?
i.e : est-ce qu'il faut faire attention à l'ordre de création des composants?
(Premier cas: l'ordre est important)
1) d'abord créer un CFP qui va contenir le nom du composant: nom_composant
2) Considérant que ce champ va etre rempli en premier dans le constructeur de choc, les autres classes peuvent se contenter d'un:
Code:cfp->getNomComposant()
(2ème cas: l'ordre n'est plus important)
Ou bien alors faut-il passer en plus des paramètres d'entrée au constructeur de chaque classe...
Par exemple, le constructeur de Camera possède un champ std::string nom_composant, alors dans le cas précédent, il n'en avait pas besoin.
J'ai fait au mieux pour expliquer mon problème!;)
Merci d'avance pour ta réponse,
Normalement, tu devrais construire tes éléments de abse puis monter dans la pyramide pour arriver à ta classe Choc, et en fait c'est ce qui est fait lors de l'appel au constructeur de Choc, il va d'abord créer ses variables internes et classes parentes avant d'appeler son propre constructeur.
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(); CImg <unsigned short> importImage (int num_image); void setNumeroChoc(int nchoc); int getNumeroChoc(); private: CFP* cfp; int numero_choc; Camera camera; }
Ainsi je lance le constructeur de choc, et dedans j'appelle le constructeur de camera:Code:
1
2
3
4
5
6
7
8
9
10 Choc::Choc(int num_choc, std::string nom_cfp) { setNumeroChoc(num_choc); //Création d'un objet caméra Camera camera(num_choc, nom_cfp); //Création d'un objet CFP //A FAIRE }
En ce qui concerne CFP, il faut d'abord que je crée un CFP, puis que je lui donne le pointeur?Code:
1
2
3
4
5
6
7 Camera::Camera(int num_choc, std::string nom_cfp) { setCorrespondanceCameraNumero(nom_cfp); int cr = Init_Endoscope (num_choc, numero_camera, &Endoscope[numero_camera-1]); std::cout << "\ncamera initialisee" << std::endl; }
Si tu fais ce que tu as indiqué dans ton choc.cpp, tu vas droit dans le mur...
C'est largement mieux.Code:
1
2
3
4
5
6 Choc::Choc(int num_choc, std::string nom_cfp) :numero_choc(num_choc), camera(num_choc, nom_cfp) { //Création d'un objet CFP //A FAIRE }
OK merci bcp Miles :D
Deux classes (ici CFP et PDC) qui ont un même attribut privé : coeff_mul car les deux en ont besoin, ça ne choque pas?
A priori non.
Au fait, pourquoi? Je pensais que cette méthode d'initialisation n'était obligatoire que pour les variables static?Citation:
Envoyé par Miles
Pour Camera, je pense que tu dois avoir raison, mais je ne sais pas encore vraiment pourquoi ?;)
Bonne nouvelle!:DCitation:
Envoyé par Miles
EDIT: fais-moi signe dès que tu penses que mon topic peut migrer vers le forum C++... Ainsi tu ne seras pas tout seul pour m'aider (tu auras le droit à un peu de repos!!!:D )
EDIT2: justement, une variable static serait-il une bonne idée pour deux classes ayant un attribut commun (qui doit valoir la même valeur!) ?
Ca ne marche pas pour des variables static... c'est une variable commune à toutes les instances d'une classe, donc une instance ne va pas l'initialiser dans son constructeur !
OK c'est noté... :traine:
Question :
cfp.cpp:
Est-ce qu'on peut accéder de cette manière à la méthode getNumeroCamera de la classe Camera?Code:
1
2
3
4
5 CFP::setImageIR(int num_choc) { int num_cam = camera.getNumeroCamera(); //suite occultée }
camera.cpp
Code:int Camera::getNumeroCamera() {return numero_camera; }
Ben oui, si camera est de type Camera et pas Camera*.