List iterator et polymorphisme

Résolu
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 15 mai 2005 à 18:36
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 15 mai 2005 à 20:02
Bonjour, bon j'ai un petit soucis avec les iterator.



C'est simple, j'ai une classe var_test et une classe sub_var qui dérive
de var_test. Elles redéfinissent toutes les deux une fonction void
eval();

var_test t1(4); // donc je définie deux objets

sub_test t2(2);



std::list < var_test*> liste;

liste.push_back(&t1);

liste.push_back(&t2);



std::list< var_test* >::const_iterator it;



it = liste.begin();

(*it)->eval();



it = liste.end();

(*it)->eval(); // <== PLANTE !



liste.back()->eval();

liste.front()->eval(); // <== AUCUN problème et pourtant a priori c'est le meme objet



// que (*it)
juste au dessus.



Je comprend pas. Voici les class vraiment très simples c'était juste pour tester.



class var_test

{

public:

var_test() { this->n = 0; }

var_test(int _c) { this->n = _c;}

var_test(const var_test & _which) { this->n = _which.n; }

virtual ~var_test() {}



virtual void
eval() { std::cout << "BASE" << this->n <<
std::endl; }

protected:

int n;

};



class sub_test : public var_test

{

public:

sub_test() {this->n = 0; }

sub_test(int _n) { this->n = _n; }

sub_test(const sub_test & _which) { this->n = _which.n; }

virtual ~sub_test() {}



virtual void eval() { std::cout << "SUB" << 4*this->n << std::endl;}

};
A voir également:

3 réponses

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
15 mai 2005 à 19:56
end(), c'est les choux (il sert a ca)



it = liste.end();

(*--it)->eval();



pour les constructeur prend l'hbitude de faire

var_test() : n(0) {}



et tu peux factoriser ca

var_test() { this->n = 0; }

var_test(int _c) { this->n = _c;}

par

var_test(int _c = 0) n(_c){} // c'est bien un constructeur par defaut
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
15 mai 2005 à 19:56
end() pointe sur l'élément suivant le dernier, pas le dernier. end()
est donc toujours un objet invalide. Par exemple, le méthodes find
retournent end() quand un objet n'est pas trouvé.

Pour un iterateur sur le dernier element, il faut faire

it = liste.end(); it--;

ou plutot utiliser un reverse_iterator et

it = liste.rbegin()
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 mai 2005 à 20:02
Pour l'histoire des constructeurs bien sur je suis d'accord, mais
c'était pas le but, c'était seulement un test pour déployer une
technique grandeur nature :)

Donc a savoir end() c'est le bout du monde oke :)
0
Rejoignez-nous