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 :

pb héritage sur classe abstraite et iterator


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut pb héritage sur classe abstraite et iterator
    Bonjour !

    Pour mon héritage tou se passe bien jusqu'à ce type d'instruction : s.begin().

    Ma classe abstraite (mere) possède un vecteur d'objets en protected dans ses attributes privés.
    Ma classe fille hérite en public de la classe abstraite.

    s.begin() fonctionne parfaitement dans la classe mère pour initialiser mes iterator, mais c'est apparamment le seul probleme que je rencontre dans mes classes filles ...

    voila le code :
    vector<Sommet>::iterator its ;

    its = s.begin();

    et l'erreur :

    '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'std::_Vector_const_iterator<_Ty,_Alloc>' (ou il n'existe pas de conversion acceptable)
    with
    [
    _Ty=Sommet,
    _Alloc=std::allocator<Sommet>
    ]

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    essaie:
    vector<Sommet>::const_iterator its ;


  3. #3
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Ca élimine certaines erreurs mais il en reste ...

    J'utilise un int et la méthode at de vector pluôt que iterator .

    Merci quand même !

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Quelles sont les erreurs qui restent?

  5. #5
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    vector<Relation>::const_iterator itr = r.begin();
    itr++;
    o << *itr->getS1()-> getNum();

    l'erreur :
    indirection non conforme

    *itr-> : si je mets autre chose (genre itr. ou itr-> soyons fous) ça ne marche pas non plus. Idem pour vector<Sommet>::const_iterator.

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Un itérateur se comporte comme un pointeur qui pointe sur l'élément du conteneur. C'est donc bien la notation "itr->" qu'il faut utiliser (ou "(*itr)." qui est équivalente). Mais j'ai peur que le problème ne soit dû au const.
    Le plus simple serait que tu regardes d'un peu plus prés ces histoires de const.

  7. #7
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Pour la notion de pointeur qu'on applique à l'iterator j'avais bien compris, j'ai tout essayé quand même puisque l'erreur est "bizarre".

    Sinon j'ai un autre problème de const apparamment :

    L'erreur :
    '=' : impossible de convertir de 'const Sommet *' en 'Sommet *'

    Le code :
    Relation::Relation (const Sommet& sommet1, const Sommet& sommet2, int &p)
    {
    s1 = &sommet1; // erreur ici
    s2 = &sommet2; // et là
    poids = p;
    }

    Sommet& Sommet::operator = (const Sommet &som)
    {
    num = som.num;
    return *this;
    }

    Merci de vos réponses !

  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
    Points : 1 051
    Points
    1 051
    Par défaut
    Pour cette erreur, c'est très simple, comme te le dit clairement le compilateur, s1 et s2 sont des Sommet * et tu tentes de leur affecter des Sommet const *.
    Il y a donc un probleme de conception. Soit s1 et s2 doivent être déclarés const car par amenés à être modifiés, soit ton constructeur de Relation doit prendre des références non constantes.

  9. #9
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Bon, ok =)

    * Je vais m'en sortir - Je vais m'en sortir * AHHHH

    Merci

  10. #10
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Il y a quand même des choses que je ne comprends pas ...

    s1 = &sommet1 donne une erreur car un const Sommet* ne peut pas être converti en Sommet*.
    Je ne vois pas pourquoi ça ne marche pas. Je n'ai jamais eu de problème en faisant des choses comme ça.
    s1 est un Sommet*, sommet1 un const Sommet& soit une référence sur l'objet passé en paramètre, objet que je ne pourrais pas modifier dans la méthode :

    Relation::Relation (const Sommet& sommet1, const Sommet& sommet2, int &p)
    {
    s1 = &sommet1; // erreur ici
    s2 = &sommet2; // et là
    ...
    }

    Je ne peux pas déclarer les attributes privés s1 et s2 en const puisque je veux pouvoir les modifier.

    J'ai un plantage quand je lance l'exe, mon code est pourtant tout simple.
    Si je mets une Relation* dans un vector il y a erreur, de même si j'appelle le destructeur de Relation.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ajouter l'attribut const à un pointeur ou une référence n'est pas du tout la même chose que le supprimer.

  12. #12
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Je ne vois pas où tu veux en venir

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tes pointeurs suppriment l'attribut const, donc il est normal que ça ne compile pas.

    C'est comme si on te donnait quelque chose que tu n'as pas le droit de modifier, mais que tu essayais de le modifier quand même --> Pan sur les doigts!

    Si tu veux un pointeur non-const, tu dois travailler sur des copies des objets passés en paramètre.

  14. #14
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Bon c'est réglé. Merci de votre patience je sais que des questions bêtes donnent envie de donner des réponses bêtes.

    Dernier problème pour moi, après je devrai plus vous embêter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Relation::~Relation ( )
    {
    	if ( s1 != NULL)
    		delete s1;
    	if ( s2 != NULL )
    		delete s2;
    }
    Je reprends : s1 et s2 sont des Sommet* (pointeurs qui contiennent l'adresse des Sommets d'origine).
    Lorsque j'appelle le destructeur de Relation : plantage.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Assure-toi que ces pointeurs sont bien nuls quand il ne pointent sur rien.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par black-falco Voir le message
    Bon c'est réglé. Merci de votre patience je sais que des questions bêtes donnent envie de donner des réponses bêtes.

    Dernier problème pour moi, après je devrai plus vous embêter :

    Relation::~Relation ( )
    {
    if ( s1 != NULL)
    delete s1;
    if ( s2 != NULL )
    delete s2;
    }

    Je reprends : s1 et s2 sont des Sommet* (pointeurs qui contiennent l'adresse des Sommets d'origine).
    Lorsque j'appelle le destructeur de Relation : plantage.
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Relation::Relation (const Sommet& sommet1, const Sommet& sommet2, int &p)
    {
    s1 = &sommet1;
    s2 = &sommet2; 
    ...
    }
    tu est sur que les sommmets que tu passe en reference existe encore??
    A mon avis il te manque un recopie des sommets dans la creation de Sommet

    ce code devrait planter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void une_fonction()
    {
    Sommet sommet1,sommet2;
    int p;
    ...//ce que tu veut avec
    relation relation_erreur_memoire(sommet1,sommet2,p);
    }
    en sortie de la fonction sommet1,sommet2,p seront detruit et lors de la destruction de relation_erreur_memoire, ton code va t'enté de detruire ce qui se trouve en s1 et s2 qui correspondent à sommet1 et sommet 2 qui ne sont pas alloué dynamiquement (indéfinie) et qui sont ou seront detruit une deusième fois.

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    pour info
    if ( s1 != NULL) delete s1;
    ne sert a rien
    http://cpp.developpez.com/faq/cpp/?p...RS_delete_NULL

  18. #18
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    ils ne sont pas censés être nuls, les pointeurs, quand ils ne pointent sur rien ?


    Voilà le code du main que j'ai codé pr vérifier tt ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    vector<Sommet> vs = vector<Sommet>();
    	vector<Relation> vr = vector<Relation>();
     
    	Sommet* s1 = new Sommet(1);
    	Sommet* s2 = new Sommet(2);
    	Relation* r = new Relation();
    	int p = 23;
    		r->setS1(*s1);
    		r->setS2(*s2);
    		r->setPoids(p);
    	cout << *s1 << endl;
    	cout << *s2 << endl;
    	cout << *r << endl;
     
     
    	vs.push_back(*s1);
    	vs.push_back(*s2);
     
    	vr.push_back(*r);
    	//
    	GrapheOriente* gno = new GrapheOriente(vs, vr);
    	cout << *gno << endl;
    	delete gno;
     
    	delete r;
    	delete s1;
    	delete s2;
    Les sommets que je créé existent toujours lorsque je détruit r.

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Seulement si on y a pensé:
    • À l'initaliser à NULL au départ
    • À le remettre à NULL une fois l'objet pointé déplacé ou détruit...


    De plus, pour qu'un delete soit possible, l'objet pointé doit absolulment être un objet créé avec new...

  20. #20
    Nouveau membre du Club
    Profil pro
    Consultant E-Business
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    D'accord.

    Donc le problème est résolu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Relation::Relation ( )
    {
    	s1 = NULL;
    	s2 = NULL;
    	poids = -1;
    }
    Mon destructeur sera donc vide.
    Une belle confusion à la source de tout ça...
    Merci beaucoup.

Discussions similaires

  1. [EJB3 Entity] manytomany sur classe abstraite
    Par maibey dans le forum Java EE
    Réponses: 2
    Dernier message: 17/01/2009, 14h14
  2. [DC] Héritage et classes abstraites
    Par leminipouce dans le forum Diagrammes de Classes
    Réponses: 7
    Dernier message: 08/01/2008, 16h14
  3. Héritage et classes abstraites
    Par Mic75 dans le forum C++
    Réponses: 2
    Dernier message: 30/10/2007, 17h06
  4. Problème héritage et classes abstraites
    Par sebzinzin dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 18h24
  5. héritage et classes abstraites
    Par reloadead dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2007, 10h08

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