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 :

Définir une classe rectangle


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut Définir une classe rectangle
    Bonjour,

    Je débute en C++, et j'essaye de faire une classe rectangle ( j'ai déjà défini une classe Point)
    On définit un rectangle à partir de son coin supérieur gauche et inférieur droit.

    Je dois tout d'abord faire une méthode init qui construit un rectangle à partir de 2 points.

    J'ai pour l'instant fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class rectangle
    { public:
     
    rectangle(){}; // constructeur par défaut
    init(Point,Point);
     
    private:
    	Point g,d; // points sup gauche et inf droit qui définissent mon rectangle
    };
     
    rectangle::init(Point a, Point b)
    {
           //a completer !
    }
    Seulement je comprends pas trop ce que ça veut dire de "construire un rectangle à partir de 2 points".
    Qu'est ce que doit faire exactement ma méthode init ? Déterminer les 4 points du rectangle ?

    J'ai l'impression qu'il faut juste faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rectangle::init(Point a, Point b)
    {
       g=a; b=g;
    }
    Puis dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char* argv[])
     
    {
    	Point a,b;
    	rectangle rect;
    	a.init(1,0, " Point a");
    	b.init(0,1,"Point b");	
    	rect.init(a,b);
    	return 0;
    }
    Est-ce que c'est juste ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par rouliane Voir le message
    Est-ce que c'est juste ?
    Non, il faut vraisemblablement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rectangle::init(Point a, Point b)
    {
       g=a; d=b;
    }
    Et puis on passera sans doute les paramètres par const & :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rectangle::init(const Point& a, const Point& b)
    {
       g=a; d=b;
    }
    C'est un exercice ou du 'vrai' code ?
    Parce qu'en pratique il faut utiliser les constructeurs et non créer des méthodes 'init'...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class rectangle
    {
      rectangle(const Point& a, const Point& b);
    };
    Ah et aussi ta classe Point et ta classe rectangle n'ont pas des noms très homogènes (Rectangle ?).

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Merci Mat.

    Alors ça n'est pas du vrai code, mais bien un exercice . Vu que ce sont des exercices progressifs, on utilise pour l'instant pas les constructeurs.

    Mais quel est l'interet de remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rectangle::init(Point a, Point b)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rectangle::init(const Point& a, const Point& b)
    ?

    Sinon, je ne comprends pas quand tu dis :

    aussi ta classe Point et ta classe rectangle n'ont pas des noms très homogènes (Rectangle ?)
    Qu'est ce qu'un nom "homogène" ?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Ah si ça fait partie d'un ensemble d'exercices progressifs alors ne tient peut-être pas compte de ma remarque sur const &, j'imagine que ça viendra par la suite.

    Sinon par pas très homogène je voulais dire que Point commence par une majuscule alors que rectangle non.

    MAT.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Ok, merci.
    Je vais essayer de faire la suite.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Alors je continue : je dois faire maintenant une méthode init qui construit un rectangle à partir d'un point et de 2 dimensions ( longueur et largeur ).
    J'ai supposé que le point était le point supérieur gauche.

    Je voulais donc créer la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    init(Point, double, double);
    Qui sera définie de cette façon ( L et l permettront de "créer" le point inférieur droit ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Rectangle::init( Point a, double L, double l)
    {
       g=a;
       d.x=a.x+L; //
       d.y=a.y-l;
    }
    Le seul problème c'est que ça marche pas évidemment parce que je ne peux pas accéder à a.x, d.x, d.y et a.y car x et y sont "private".

    Sauriez-vous comment je pourrais faire pour remédier à celà ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Je crois que j'ai trouvé. J'ai créer une méthode qui retourne l'abscisse et l'ordonne d'un point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	int abscisse()
    	{return x;}
    	int ordonnee()
    	{return y;}
    et j'ai alors la méthode init dans la classe Rectangle qui est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Rectangle::init( Point a, double L, double l)
    {
       g=a;
       Point c;
       c.init(a.abscisse()+L, a.ordonnee()-l, "Point c");
       d=c;
     
    }
    Ca vous semble correct ?

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Et puis donner un type de retour pour cette fonction init...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Oui j'ai oublié, merci.

    Pour la suite, je dois remplacer ma fonction init dans ma classe Point par des constructeurs.

    Je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Point
    {
    public:
    	Point(){x=y=0;}; // constructeur par défaut
    	Point( const double &, const double &, string); // constructeurs
     
    private:
    	double x; //abscisse
    	double y; //ordonnee
    	string nom; // nom
     
    };
    où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Point::Point (const double &a, const double &b, string nom1)
    {
    	x=a;y=b; nom=nom1;
    }
    J'ai mis un cinstructeur par défaut, mais est-ce la bonne façon de le définir ?

    Sinon, en suivant les indications de Mat, j'ai mis "const double & a" mais ça marche aussi avec "double a".
    Je ne comprends pas l'utilité de mettre ça alors ?

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Je te conseille vivement d'aller faire un tour dans la faq c++ du site et de lire du début à la fin. Bon nombre de tes questions y trouveront réponse.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Point
    {
    public:
    	Point(){x=y=0;}; // constructeur par défaut
    	Point( const double &, const double &, string); // constructeurs
    	
    private:
    	double x; //abscisse
    	double y; //ordonnee
    	string nom; // nom
     
    };
    Le point virgule en rouge n'a pas lieu d'être !
    Pour le const, comme l'a dit NiamorH, tu trouveras la réponse dans la FAQ. Sache juste que de déclarer deux constructeurs différents permet au compilateur de choisir le bon au moment voulu : constant ou pas.

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par rouliane Voir le message
    Sinon, en suivant les indications de Mat, j'ai mis "const double & a" mais ça marche aussi avec "double a".
    Je ne comprends pas l'utilité de mettre ça alors ?
    En général on passe les types de base (int, double, etc..) par copie (donc sans le const &) et les types utilisateurs (Point, Rectangle, etc..) par const &, ça évite de faire des copies pour les paramètres un peu plus couteux à copier, justement.

    MAT.

  13. #13
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut

    Cela doit probablement être dans la suite de l'exercice mais au cas où :
    Dans un constructeur il est fortement recommandé (pour plusieurs raisons : --> cf. ) d'utiliser les listes d'initialisation.
    Ainsi ton constructeur
    devient:
    Et il en va de même pour tout tes autres constructeurs.

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Et, de toutes façons, évite les horribles constructions syntaxiques que sont
    Préfère leur toujours la construction, peut être un peu plus longue à écrire (une demi seconde ) mais tellement plus lisible de
    Outre le manque de visibilité de la méthode que tu as employée, il se peut toujours que tu finisse (si x et y venaient un jour à être des pointeurs, par exemple) par avoir un comportement assez bizard avec cette construction syntaxique, ou la modification de x pourrait entraîner la modification de y, ou inversement, ce qui ne sera sans doute jamais ce que tu souhaites
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Définir une classe css dans le code jquery.
    Par piotrr dans le forum jQuery
    Réponses: 9
    Dernier message: 27/07/2009, 11h56
  2. Définir une Classe triangle
    Par Pingouin22 dans le forum C++
    Réponses: 13
    Dernier message: 16/10/2007, 10h07
  3. Réponses: 19
    Dernier message: 14/08/2007, 14h41
  4. Définir une classe dans une autre classe
    Par acieroid dans le forum C++
    Réponses: 7
    Dernier message: 21/05/2006, 23h24
  5. Définir une class comme élement graphique
    Par Janitrix dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 14/11/2005, 22h41

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