Classe dans une classe

Classe dans une classe - C++ - Programmation

Marsh Posté le 18-02-2008 à 22:38:08    

Bonsoir,

 

Dans un cadre scolaire j'ai besoin de définir une classe UnCercle qui contient un objet de classe UnPoint.

 

Voilà mon .h qui définit cette classe UnCercle :

 
Code :
  1. #ifndef UNCERCLE_H
  2. #define UNCERCLE_H
  3. class UnCercle {
  4. private :
  5. class UnPoint {
  6. private :
  7.   int sonAbscisse;
  8.   int sonOrdonnee;
  9. public :
  10.   UnPoint(void);
  11.   ~UnPoint(void);
  12.   void afficheToi(void);
  13.   int getsonAbscisse(void);
  14.   void setsonAbscisse(int telAbscisse);
  15.   int getsonOrdonnee(void);
  16.   void setsonOrdonnee(int telleOrdonnee);
  17. };
  18. int sonRayon;
  19. public:
  20. UnCercle(void);
  21. ~UnCercle(void);
  22. void afficheToi(void);
  23. int getsonRayon(void);
  24. void setsonRayon (int telRayon);
  25. };
  26. #endif
 

Je suis maintenant en train d'écrire une méthode afficheToi, qui permet d'afficher les caractéristiques du cercle (coordonnées du centre et rayon).

 

Mes questions sont les suivantes, ma classe est-elle correctement déclarée ( et comment accéder aux caractéristiques du point (sonAbscisse et sonOrdonnee) dans ma méthode afficheToi ?

 

Merci d'avance :)


Message édité par darkgloom le 18-02-2008 à 22:55:44
Reply

Marsh Posté le 18-02-2008 à 22:38:08   

Reply

Marsh Posté le 18-02-2008 à 23:07:54    

Oui je vois merci :)
 
Par contre comment accéder à sonAbscisse et sonOrdonnee de sonCentre ?
Quelle est la syntaxe stp ?
 
Merci en tout cas :)

Reply

Marsh Posté le 19-02-2008 à 07:58:27    

bah :
 

Code :
  1. int x;
  2. x = sonCentre.getsonAbscisse();


 
Tu manques de bases là. Un petit tour par la case bouquin s'impose

Reply

Marsh Posté le 19-02-2008 à 09:17:16    

Je commence tout juste le C++, j'ai simplement des bases en C.
 
Merci de ton aide ^^

Reply

Marsh Posté le 19-02-2008 à 09:19:13    

tout juste ... et on te fait déjà faire de l'objet alors que visiblement les bases sont pas là :|
Quelle école ?

Reply

Marsh Posté le 19-02-2008 à 09:27:59    

IUT A de Lyon1.
 
(Petite) autre question, j'arrive à faire des sonCentre.getsonAbscisse() dans mon .cpp, là où sont écrites mes méthodes, mais pas dans ma fonction main.
Quelle est l'astuce pour faire un sonCentre.setsonAbscisse() et sonCentre.setsonOrdonnee() dans main, écrire encore une autre méthode du type :
 

Code :
  1. void setsonAbscisse(){
  2. sonCentre.sonAbscisse=sonCentre.telAbscisse
  3. }


 
?


Message édité par darkgloom le 19-02-2008 à 09:39:39
Reply

Marsh Posté le 19-02-2008 à 09:50:32    

Y a soit un manque sérieux de cours de base soit un manque de travail.
Outre une convention de nommage à coucher dehors, ça manque de forme canonique de
coplien et d'accesseur/mutateur bien construit. Allons y progressivement.

 

La classe point :

Code :
  1. class point
  2. {
  3.   public:
  4.  
  5.   point(int px=0,int py=0) : x(px), y(py) {}
  6.   point( const point& p ) : x(p.x), y(p.y) {}
  7.   ~point() {}
  8.  
  9.   point& operator=(const point& p )
  10.   {
  11.     if(this != &p)
  12.     {
  13.       x = p.x;
  14.       y = p.y;
  15.     } 
  16.     return *this;
  17.   }
  18.  
  19.   int& X()             { return x; }
  20.   const int& X() const { return x; }
  21.   int& Y()             { return y; }
  22.   const int& Y() const { return y; }
  23.  
  24.   private:
  25.   int x,y;
  26. };
 

le quatuor sacré (constructeur par défaut,destructeur, constructeur de copie, opérateur d'affectation) est la BASE d'une classe propre.
le constructeur par défaut utilise une liste d'initialisation pour construire l'objet.

 

Les accesseurs/mutateurs utilisent des références et le marqueur const pour distinguer les accès en lecture/écriture. Exemple d'utilisation

 
Code :
  1. point p;         // point (0,0) construit par defaut
  2. point q(4,-3);   // point (4,-3) construit par defaut
  3. p.X() = q.Y();   // p est desormais (-3,0)
  4. point u; // (0,0)
  5. u = p;   // u copie p et vaut (-3,0)
 

Ensuite, cercle.
Réfléchissons deux secondes, quels sont les constituant du cercle : son centre et son rayon.
Ça nous donne la signature de son constructeur. On va dire que le cercle "par défaut" est placé en (0,0)
et à un rayon nul.

 
Code :
  1. class cercle
  2. {
  3.   public:
  4.  
  5.   cercle(const point& pc = point(), int pr=0) : c(pc), r(pr) {}
  6.   cercle( const cercle& pc ) : c(pc.c), r(pc.r) {}
  7.   ~cercle() {}
  8.  
  9.   cercle& operator=(const cercle& pc )
  10.   {
  11.     if(this != &pc)
  12.     {
  13.       c = pc.c;
  14.       r = pc.r;
  15.     } 
  16.     return *this;
  17.   }
  18.  
  19.   point& centre()             { return c; }
  20.   const point& centre() const { return c; }
  21.   int& rayon()                { return r; }
  22.   const int& rayon() const    { return r; }
  23.   private:
  24.   int r;
  25.   point centre;
  26. };
 

même structure et même principe. Ici on gagne a réutiliser point et sa FCC car on va pouvoir copier direct son contenu d'un centre
à l'autre. Exemple :

 
Code :
  1. cercle z; // cercle par défaut (0,0) et rayon 0
  2. cercle a( point(3,3), 5 ) // cercle centree en (3,3) de rayon 5
  3. a.centre() = point(0,-5) // on deplace a en (0,-5)
  4. a.rayon() = 2*a.rayon(); // on double son rayon
  5. point x = a.centre();  // recuperation du centre sous forme de point
 

Pose des questions si qqchose n'est pas clair


Message édité par Joel F le 19-02-2008 à 09:51:40
Reply

Marsh Posté le 19-02-2008 à 18:44:15    

Quelques questions, parceque bien que ma convention de nommage ne soit pas claire, chaque variable ou fonction veut dire quelque chose et je trouve qu'on s'y repère plus facilement.
 
Que signifient les ":" lors de l'écriture des accesseurs ?
Le destructeur ne fait aucune opération, c'est normal ?
Pourquoi toutes les méthodes sont passées en paramètres ?
 
Je suis un peu perdue dans ton code :s

Reply

Marsh Posté le 19-02-2008 à 20:04:21    

darkgloom a écrit :


Quelques questions, parceque bien que ma convention de nommage ne soit pas claire, chaque variable ou fonction veut dire quelque chose et je trouve qu'on s'y repère plus facilement.


Les miennes aussi ;) Juste que mélanger anglais et français c'est vraiment laid.
 

darkgloom a écrit :


Que signifient les ":" lors de l'écriture des accesseurs ?


Tu veut dire dans les constructeurs ???
 

Code :
  1. point(int px=0,int py=0) : x(px), y(py) {}


 
Ça s'appelle une liste d'initialisation, ca permets d'initialiser tes membres avant d'attaquer
l'exécution du code contenu dans le constructeur. C'est la manière disons propre de faire les choses.
 

darkgloom a écrit :


Le destructeur ne fait aucune opération, c'est normal ?


Que voudrais tu qu'il fasse ?
Les membres de cercle et point sont des types atomiques.
 

darkgloom a écrit :


Pourquoi toutes les méthodes sont passées en paramètres ?


Je comprends pas la question
 

darkgloom a écrit :


Je suis un peu perdue dans ton code :s


T'inquiètes ça finira par rentrer :o

Reply

Marsh Posté le 19-02-2008 à 20:20:49    

Ça s'appelle une liste d'initialisation, ca permets d'initialiser tes membres avant d'attaquer
l'exécution du code contenu dans le constructeur. C'est la manière disons propre de faire les choses.  
 
:: Ok, et concrètement que signifient les x(px) et y(px) ? (histoire de pouvoir reproduire ça quoi ^^)
 
Que voudrais tu qu'il fasse ?
Les membres de cercle et point sont des types atomiques.  
 
:: Ok donc dans la majorité des cas le destructeur n'a pas de coprs ?
 
Je comprends pas la question  
 
:: Je viens de me rendre compte que j'ai dit un peu n'importe quoi, fin en gros pourquoi mettre des & dans certaines méthodes ?
 
 
 
Merci de ta patience et de ton aide :)
 

Reply

Marsh Posté le 19-02-2008 à 20:20:49   

Reply

Marsh Posté le 19-02-2008 à 20:24:23    

darkgloom a écrit :


Ok, et concrètement que signifient les x(px) et y(px) ? (histoire de pouvoir reproduire ça quoi ^^)


 
En gros ça :
 

Code :
  1. point(int px=0,int py=0) : x(px), y(py) {}


 
c'est pareil que :
 

Code :
  1. point(int px=0,int py=0)
  2. {
  3.   x = px;
  4.   y = py;
  5. }


 

darkgloom a écrit :


Ok donc dans la majorité des cas le destructeur n'a pas de coprs ?


 
Plus ou moins. Du moment ou tu n'as pas de ressources systèmes à libérer (mémoire allouée via new, socket, etc), oui.
Rencarde toi sur le mécanisme de RAII pour plus de détails
 

darkgloom a écrit :


Je viens de me rendre compte que j'ai dit un peu n'importe quoi, fin en gros pourquoi mettre des & dans certaines méthodes ?


 
Je renvoie un référence. Ça permets d'éviter les copies inutiles dans le cas des const T&
et de permettre de modifier la valeur renvoyer dans le cas des T&. Pour les types atomiques, ça sers pas trop
mais c'est jamais perdu. Pour les méthodes qui renvoient des objets, c'est mieux. Le concept de référence est un concept
extrêmement important en C++.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed