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 :

Erreur incomprehensible en inserant des pointeurs de classe abstraite dans un vecteur


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Erreur incomprehensible en inserant des pointeurs de classe abstraite dans un vecteur
    Bonjour a tous,

    Voici mon probleme: J'ai une classe abstraite qui s'appelle "Piece", des classes instanciables "Roi", "Pion" et "Cavalier", et un objet "Echiquier" dont un attribut est un vecteur de pointeurs sur Piece (Piece*).

    Le probleme, c'est que quand j'essaie d'inserer un "Roi" par adresse dans ce vecteur, le compilateur g++ en perd son latin!? Voici mon code:

    Main.cxx
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include "Position.h"
    #include "Roi.h"
    #include "Cavalier.h"
    #include "Pion.h"
    #include "Echiquier.h"
     
    int main ()
    {
    	Position p(15);
    	Position q(14);
    	p.AffichePosition();
    	std::cout<<std::endl<<p<<std::endl;
     
    	if (p==q)
    	{
    		std::cout<<"p = q"<<std::endl;
    	}
    	else
    	{
    		std::cout<<"p != q"<<std::endl;
    	}
     
    	Roi r = Roi("blanc",p);
    	Cavalier c = Cavalier("noir",q);
     
    	Piece* ad_r = &r;
    	Piece* ad_c = &c;	
     
    	std::cout<<(*ad_r).toDebug()<<std::endl;
    	std::cout<<(*ad_c).toDebug()<<std::endl;
     
    	Echiquier E;
    	E.ajouter(ad_r);
     
    	return 0.;
    }
    Echiquier.h
    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
     
    #ifndef ECHIQUIER
    #define ECHIQUIER
     
    #include <vector>
    #include "Piece.h"
     
    class Echiquier
    {
    	private:
    		std::vector<Piece*> pieces;
     
    	public:
    		void ajouter(Piece*);
    		void afficher();
     
     
    };
     
    #endif
    Echiquier.cxx
    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
    21
    22
    23
    24
    25
     
    #include "Echiquier.h"
    #include <iostream>
     
    void Echiquier::ajouter(Piece* pi)
    {
    	pieces.insert(pi);
    }
     
    void Echiquier::afficher()
    {
    	for (int i=0; i<8; i++)
    	{
    		for (int j=0; j<8; j++)
    		{
    			int k=0;
    			while (k<pieces.size() && (pieces.at(k).getPosition().getX()!=i || pieces.at(k).getPosition().getY()!=j))
    			{
    				std::cout<<(pieces.at(k).toDebug());
    				k++;
    			}
    		}
    		std::cout<<std::endl;
    	}
    }
    Le compilateur me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Echiquier.cxx: In member function ‘void Echiquier::ajouter(Piece*)’:
    Echiquier.cxx:6:19: error: no matching function for call to ‘std::vector<Piece*>::insert(Piece&)’
    /usr/include/c++/4.5/bits/vector.tcc:106:5: note: candidates are: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::iterator, const value_type&) [with _Tp = Piece*, _Alloc = std::allocator<Piece*>, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<Piece**, std::vector<Piece*> >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer = Piece**, value_type = Piece*]
    /usr/include/c++/4.5/bits/stl_vector.h:858:7: note:                 void std::vector<_Tp, _Alloc>::insert(std::vector<_Tp, _Alloc>::iterator, std::vector::size_type, const value_type&) [with _Tp = Piece*, _Alloc = std::allocator<Piece*>, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<Piece**, std::vector<Piece*> >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer = Piece**, std::vector::size_type = unsigned int, value_type = Piece*]
    Echiquier.cxx: In member function ‘void Echiquier::afficher()’:
    Echiquier.cxx:16:44: error: request for member ‘getPosition’ in ‘((Echiquier*)this)->Echiquier::pieces.std::vector<_Tp, _Alloc>::at [with _Tp = Piece*, _Alloc = std::allocator<Piece*>, std::vector<_Tp, _Alloc>::reference = Piece*&, std::vector::size_type = unsigned int](((unsigned int)k))’, which is of non-class type ‘Piece*’
    Echiquier.cxx:16:84: error: request for member ‘getPosition’ in ‘((Echiquier*)this)->Echiquier::pieces.std::vector<_Tp, _Alloc>::at [with _Tp = Piece*, _Alloc = std::allocator<Piece*>, std::vector<_Tp, _Alloc>::reference = Piece*&, std::vector::size_type = unsigned int](((unsigned int)k))’, which is of non-class type ‘Piece*’
    Echiquier.cxx:18:30: error: request for member ‘toDebug’ in ‘((Echiquier*)this)->Echiquier::pieces.std::vector<_Tp, _Alloc>::at [with _Tp = Piece*, _Alloc = std::allocator<Piece*>, std::vector<_Tp, _Alloc>::reference = Piece*&, std::vector::size_type = unsigned int](((unsigned int)k))’, which is of non-class type ‘Piece*’
    J'ai pas mal cherche, mais la j'avoue que je suis impuissant...

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Au bout de 4 heures, je me suis apercu qu'il fallait un push_back au lieu d'un insert. VDM

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer des instances de classes EMF dans Eclipse avec une jolie IHM
    Par obernard dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 24/02/2009, 19h21
  2. Erreur du designer avec héritage d'une classe abstraite
    Par Xzander dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2007, 00h36
  3. Réponses: 2
    Dernier message: 05/03/2007, 18h55
  4. [MySQL] Erreur sql pour inserer des checkbox
    Par digger dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/11/2005, 11h06
  5. polymorphisme, pointeurs et classes abstraites
    Par legend666 dans le forum C++
    Réponses: 10
    Dernier message: 02/11/2005, 16h44

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