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 :

Parcours d'un vector


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut Parcours d'un vector
    Bonjour,

    J'ai deux classe "Cartésien" et "Polaire" qui dérive tous les deux de la classe "Point".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Cartesien : public Point
    {
        private:
            double _x, _y;
     
        public:
            Cartesien();
            Cartesien(double, double);
            Cartesien(const Polaire & inPointPolaire);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Polaire : public Point
    {
        private:
            double _r, _theta;
     
        public:
            Polaire();
            Polaire(double, double);
            Polaire(const Cartesien & inC);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Point
    {
        public:
            Point();
    };

    J'ai une classe "Nuage" qui contient un ensemble de "Point" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Nuage
    {
        private:
            std::vector<Point *> _tabPoint;
     
        public:
            Nuage();
     
            void calculBarycentre();
            void ajouterPoint(const Point & inP);
    };


    Le but est de calculer le barycentre du nuage :

    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
    void Nuage::calculBarycentre()
    {
        double x = 0., y = 0., Gx, Gy;
        std::vector<Point *>::iterator it;
     
        for (it = _tabPoint.begin(); it != _tabPoint.end(); ++it)
        {
     
        }
     
        Gx = x / _tabPoint.size();
        Gy = y / _tabPoint.size();
     
        std::cout << "Gx = " << Gx << ", Gy = " << Gy << std::endl;
    }
    Ma question : Comment accéder aux cordonnées cartésiennes de tous les points (sachant que j'ai tous les accesseurs nécessaires).

    J'ai des opérateurs de conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Cartesien::operator Polaire()
    {
        double r, theta;
     
        r     = sqrt(_x * _x + _y * _y);
        theta = atan(_y / _x);
     
        return Polaire(r, theta);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Polaire::operator Cartesien()
    {
        double x, y;
     
        x = _r * sin(_theta);
        y = _r * cos(_theta);
     
        return Cartesien(x, y);
    }
    Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Ta classe point doit avoir une méthode virtuelle pure (abstraite) getCoordonneeCartesiennes :
    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
    class Cartesien;
     
    class Point
    {
           public :
                virtual Cartesien   getCoordonneeCarthesiennes(void) = 0;
    };
     
    class Cartesien
    {
          public :
                     Cartesien   getCoordonneeCarthesiennes(void){ return *this; }
    };
     
     
    class Polaire
    {
          public :
                     Cartesien   getCoordonneeCarthesiennes(void){ //conversion return ...; }
    };

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    D'après ce que j'ai fait avant il faut utilisé un cast d'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (it = _tabPoint.begin(); it != _tabPoint.end(); ++it)
    {
        Cartesien c = (Cartesien )(**it);
    }
    Mais sa ne fonctionne pas

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par CliffeCSTL Voir le message
    D'après ce que j'ai fait avant il faut utilisé un cast d'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (it = _tabPoint.begin(); it != _tabPoint.end(); ++it)
    {
        Cartesien c = (Cartesien )(**it);
    }
    Mais sa ne fonctionne pas
    Un Cartesien est un point mais un point n'est pas un cartesien !
    Faire des cast est souvent plus une erreur de conception qu'autre chose.
    Défini une méthode virtuelle pure et tu pourra faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (it = _tabPoint.begin(); it != _tabPoint.end(); ++it)
    {
        Cartesien c = (*it)->getCoordonneeCartesien();
    }

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Et si je voulais avoir les coordonnées polaire à la place ? il me faudrait 2 fonctions.

    Et si j'avais 50 types de points il me faudrait 50 fonctions ?


    On ne peut pas faire mieux ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Que ce soit des fonctions ou des cast (ou n'importe quoi d'autre), tu devrais multiplier les lignes de code du nombre de type souhaité.

    Mieux ? pour ma part je travaillerai uniquement avec des méthodes getX() getY() qui me sortirait les coordonnées du point, quel qu'il soit.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    Je vais pas détailler, il y a trop de chose à dire et j'ai pas trop le temps pour le moment

    Pourquoi un héritage de Point ? Qui ne fait rien en plus.
    Point devrait avoir sans conteste une sémantique d'entité (cf FAQ), donc ne devrait pas pouvoir être dérivé. EDIT : Point => sémantique de valeur, non dérivable
    Là tu fais ça pour mettre dans un conteneur. C'est un mélange des genres très moche. Donc conception bancale = code bancale
    Le plus simple serait la méthode de Bousk.
    En plus, tu fais du mal à ce pauvre Liskov (encore et toujours)

    Bref, le plus simple : utilise CGAL (Computational Geometry Algorithms Library) ou Boost.geometry

    Si tu veux faire toi même, c'est quoi tes besoins ?
    * mélanger des coordonnées cartésiennes et polaires dans un même conteneur ?
    * pouvoir manipuler plusieurs types de projection 2D ?

  8. #8
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    C'est un simple TP

    Je répond aux questions tel quel

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    c'est pas toi qui a pondu ce code, mais ton prof ? Aie...

  10. #10
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Salut

    Je vais pas détailler, il y a trop de chose à dire et j'ai pas trop le temps pour le moment

    Pourquoi un héritage de Point ? Qui ne fait rien en plus.
    Point devrait avoir sans conteste une sémantique d'entité (cf FAQ), donc ne devrait pas pouvoir être dérivé.
    Là tu fais ça pour mettre dans un conteneur. C'est un mélange des genres très moche. Donc conception bancale = code bancale
    Le plus simple serait la méthode de Bousk.
    En plus, tu fais du mal à ce pauvre Liskov (encore et toujours)

    Bref, le plus simple : utilise CGAL (Computational Geometry Algorithms Library) ou Boost.geometry

    Si tu veux faire toi même, c'est quoi tes besoins ?
    * mélanger des coordonnées cartésiennes et polaires dans un même conteneur ?
    * pouvoir manipuler plusieurs types de projection 2D ?
    Bonjour,

    je suis en train de découvrir les notion de sémantique d'entité et de sémantique de valeur, et je me demandais ce qui vous amenait à dire qu'un point est sans conteste une classe a sémantique d'entité. Pour moi un point avec les mêmes coordonnées est le même point, non ? Je ne penses pas avoir raison mais j'aimerais savoir pourquoi j'ai tord de penser cela

    edit : sans vouloir faire du HS, la seule chose que je vois c'est que vous imaginez les points dans des repères relatifs (et donc distincts dans le repère absolu)

    edit : pour Liskov j'espère que vous parlez du principe, parce que sinon c'est à elle que vous faites mal

  11. #11
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut


    Qui a osé dire qu'une classe Point devrait avoir une sémantique d'entité ?
    Qui a osé dire qu'une sémantique d'entité n'est pas compatible avec l'héritage ?
    Que l'on pende haut et court l'odieux personnage qui profère de tels propos !

    ...

    Ah. On me dit dans l'oreillette que c'est peut être moi...

  12. #12
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut


    le pauvre posteur original qu'a du arriver devant son prof "mistake" en poche... pas sur que son prof l'ai contredit non plus

Discussions similaires

  1. Parcours d'un vector
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 23/12/2010, 08h47
  2. Perf de parcours vector : iterator vs index
    Par codnob dans le forum SL & STL
    Réponses: 20
    Dernier message: 28/01/2010, 14h23
  3. Parcours en largeur d'une arborescence->Vector
    Par Paniez dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 07/12/2006, 22h21
  4. Probleme avec parcours de stl::vector
    Par MDiabolo dans le forum SL & STL
    Réponses: 10
    Dernier message: 08/03/2006, 00h35
  5. [Débutant(e)] Parcours d'un hashtable comme un vector
    Par Arkan dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 12/04/2005, 17h55

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