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

Langage C++ Discussion :

surcharger -> pour un vector de pointeur.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut surcharger -> pour un vector de pointeur.
    Bonjour,

    Alors je continue mon petit chemin d'apprentissage en C++ et je suis encore confronté à un problème de vector vers des pointeurs...
    J'aimerais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     vector <*truc> test;
    test->affiche();
    Mais pour cela il faut que je surcharge mon opérateur -> de sorte qu'il applique à chaque pointeur de mon vector test la méthode affiche() de la class Truc...

    Comment faire ???
    J'ai beau cherché, je ne trouve pas comment je peux faire pour surcharge -> vers une fonction...
    après je pensais à un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <typename S>
    void operator->(const vector<S> & hop, FONCTION fonc() ){
        for(size_t i=0;i<(hop.size());++i) (hop[i])->fonc();
        }
    Mais voilà, que dois-je mettre pour fonction ??

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    tout d'abord, ce n'est pas:
    mais
    Ensuite, tu te compliques trop la vie. vector est une classe de la bibliothèque standard, n'y touche pas.

    De plus, le c++ permet une approche objet, il serait dommage de s'en passer. Cela signifie qu'en fait, pour faire simple, chaque objet doit se débrouiller tout seul. Un objet doit donc s'afficher lui-même (en lui fournissant ce dont il a besoin pour le faire). C'est la raison pour laquelle, concrètement, habituellement on fait quelque chose dans le style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // un opérateur d'indirection de flux pour ton objet
    ostream & operator << ( ostream& ostr, const Truc & t )
    {
    	ostr << /* ce qu'il faut afficher ici */;
    	return ostr;
    }
     
    // et pour l'affichage (avec vt un vector<Truc>):
    copy( vt.begin(), vt.end(), ostream_iterator<Truc>(cout, " ")); // cette ligne utilise l'operator << implémenté ci-dessus
    Le code ci-dessus fonctionne pour un vector<Truc>. Toi tu as un vector<Truc*>, il faudra donc adapter le code. Ça devrait donner quelque chose dans le style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // l'opérateur d'indirection de flux
    ostream & operator << ( ostream& ostr, const Truc * t )
    {
    	ostr << /* ce qu'il faut afficher ici */;
    	return ostr;
    }
     
    // l'affichage sur la console (avec vt un vector<Truc*>):
    copy( vt.begin(), vt.end(), ostream_iterator<const Truc*>(cout, " "));

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut
    Non, ce n'est pas ça du tout mon problème, j'ai évidemment surchargé cout << de manière à ce que mon affichage fonctionne bien... Je l'ai même fait de manière polymorphique comme indiqué dans la FAQ

    J'ai pris la méthode affiche() en exemple, en réalité j'aimerais que l'ensemble de mon vector de pointeur puisse accéder à une méthode quelconque de la classe des pointeurs en surchargeant une fois pour toute un opérateur binaire ^^'

    Mon problème c'est vraiment pour appeler une méthode qui se trouve dans tous les pointeurs de mon vector<Truc*> !!!

    J'ai une méthode nommée bouger() dans ma class voiture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Voiture : public Vehicule {
    public:
    ...
    void afficher();
    void bouger(double);
    ...
    protected:
    ...
    double[3] position;
    ...
    };
    Ensuite j'ai dans ma class circuit un attribut qui se trouve être la liste des voitures présentes sur le circuit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Circuit{
    ...
    public: 
    void evolue();
    ...
    protected:
    vector<Voiture*> listeVoiture;
    ...
    };
    Maintenant j'ai un soucis avec ma fonction evolue() de mon circuit :
    j'aimerais que pour chaque voiture contenue dans mon vector de pointeur vers des voitures, l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeVoiture[i]->bouger(dt);
    se fasse... Mais voilà, tant qu'à faire je préférerais surcharger -> pour les vector de sorte qu'il fasse appel à chaque pointeur contenu à la fonction que je mettrais après, avec les arguments que je lui donnerais...

    De sorte à pouvoir écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void evolue(){
    double dt(0.1);  //mon pas de temps, j'ai implémenté un truc qui ressemble à la dérivée pour calculer mes vitesses et inversement un truc qui se trouve être l'intégrale pour mettre à jour mes positions en fonction d'une vitesse.
    listeVoiture->bouger(dt);
     
    if(vainqueur())
    {...}
    else
    evolue();
    }
    Et j'y tiens, j'aimerais surcharger un opérateur de sorte à rendre l'appel à une fonction pour l'ensemble des pointeurs d'un vector plus aisée

    Je sais, je suis têtu, mais bon ^^' J'apprends

    Donc pas moyen de faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename S>
    void operator->(const vector<S> & hop, FONCTION fonc(ARG) ){
        for(size_t y=0;y<(hop.size());++y) 
    (hop[y])->fonc(ARG);
        }
    Ou alors via une macro peut-être??
    Mais ça je connais pas du tout du tout, j'ai juste vu le mot en fouinant dans le forum

    PS : les fautes du genre *Truc au lieu de Truc* ne sont pas relevantes, après tout j'écris les codes d'exemple à la volée sans les passer au compilateur ^^'
    Donc faute de frappe

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut
    Non, pas vraiment : j'ai déjà repéré le for_each, mais à moins que je ne les aie mal compris, lui et son fonctionnement, ce n'est pas ce que je cherche... ou bien ?
    En effet, avec for_each, on arrive à appliquer une fonction avec comme argument les éléments contenus dans le vector... Mais on y arrive pas à appeler une méthode de l'objet contenu dans mon vector... !!!

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut
    Ah !!!
    I get it !

    Je vois, en effet ça passe, mais tu utilises un foncteur...

    Je ne connais pas bien les foncteurs, j'ai juste lu un chapitre là-dessus dans un bouquin et j'ai jamais trouvé l'utilité que ça pouvait avoir, mais là, je comprends mieux.


    C'est génial comme technique ^^


    Mais j'ai encore un soucis :
    j'ai un template vector<typename V>
    j'ai une classe voiture...
    et une autre moto...
    j'ai un operator ->*

    Et maintenant j'aimerai que dans mon circuit, je puisse faire :
    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 circuit {
    vector<Voiture*> listV;
    vector<Moto*> listM;
     
    void remplir_list() {
    listV/M.push_back(...);
     ...
    }
     
    void evolue {
    listV->*bouger();
    listM->*bouger();
    ...
    }
    Donc je pensais à un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      struct inter
    {
      void operator()(pointeur_type_quelconque const& c) { c.some_methods(); }
    };
    Mais pour faire ce pointeur d'un type quelconque, il faut que je fasse un template du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename A>
    typedef A* pointe;
    Donc ça donnerait :


    et ensuite pour mon opérateur le mélange de tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <typename N>
    void operator->*(const vector<N> & vec, UnaryFunction fonc){
     struct inter
    {
      void operator()(N const& c) { c->fonc(); }
    };
     
    for_each(vec.begin(), vec.end(),inter())}
    En effet, j'aimerais donner simplement le nom de la méthode à mon opérateur et qu'il me fasse tout ça, mais là, je suis vraiment pas sur de moi...

Discussions similaires

  1. libération de la mémoire pour un vector de pointeur
    Par bobo034 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/08/2008, 17h06
  2. pb avec vectors de pointeurs
    Par e-teo dans le forum SL & STL
    Réponses: 5
    Dernier message: 27/07/2005, 14h11
  3. [TListColumn] Comment le surcharger notemment pour l'IDE ?
    Par phplive dans le forum Composants VCL
    Réponses: 14
    Dernier message: 25/05/2005, 16h44
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

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