Surcharge de l'operateur [] => erreur avec un objet créé dynamiquement [Résolu]

Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
- - Dernière réponse : julien_boss
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
- 19 mars 2007 à 20:51
Bonjour,
j'ai une classe LogFile, dans laquelle j'ai surchargé l'operateur [] pour qu'il renvoit un ENREGISTREMENT (structure perso).
Je fais ceci :

LogFile *lf, lf2;
lf = new LogFile();
ENREGISTREMENT en = lf[2],                       //Bug à ce niveau là
                                   en2 = lf->operator[](2), //Fonctionne ...
                                   en3 = lf2[2];   //Fonctionne aussi ...
delete lf;

et là ca parait clair, ca coince lorsque l'objet est créé dynamiquement

voici la définition (ou déclaration, je ne sais jms distinguer les 2 ) de la surcharge :

ENREGISTREMENT& LogFile::operator[](int n)
{
    ENREGISTREMENT enVoid = {-1, " ", " ", " ", " "};
    ENREGISTREMENT &enV = enVoid;           
    if(Good() && n>=0 && n<m_nbEn)
        return m_tabEn[n];
    else return enV; 
}

donc comment faire pour que la surcharge de [] marche sur un objet créé dynamiquement ? merci
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
3
Merci
Déjà c'est l'implémentation là :-)
Ensuite c'est normal que ça plante:
lorsque tu écris : en=lf[2];
lf est un pointeur donc en fait avec cette écriture on tente d'accéder au deuxième élément du tableau alors qu'il n'en contient qu'un seul d'où bug.
L'écriture correcte est : lf->operator[](2) ou bien encore (*lf)[2] qui cette fois appelle la fonction operator[] de l'objet.
C'est pas forcément très joli à écrire peut-être qu'en passant par des références :
LogFile& RLF=(*lf).
et ensuite en=RLF[2];

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_juju12
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
3
Merci
Pour le premier truc c'est simple :
tu crées un tableau à l'intérieur de la procédure et tu renvoies une référence dessus...sauf que ce tableau est détruit à la fin de la procédure et donc ta référence est invalide=>erreur
Partant de là  tes deux autres bouts de code devraient pas marcher non plus

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_juju12
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
0
Merci
merci ca marche comme ca, c'était assez con mais fallait y penser ^^
y'aurait il quand meme un moyen de faire marcher l'opérateur [] sur un pointeur d'objet, avec une implémantation différente ?
Commenter la réponse de julien_boss
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
Je vois pas d'autres méthodes que :
en=lf->operator[](2) // appel de fonction depuis pointeur
en=(*lf)[2] // appel depuis objet pointé par le pointeur
en=RLF[2] // où RLF est une référence à l'objet pointé par lf, peut-être l'écriture la plus jolie
Commenter la réponse de cs_juju12
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
0
Merci
ok merci :)
Commenter la réponse de julien_boss
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
0
Merci
tiens j'en profite pour demander pourquoi ce code foire :

je détail d'abord la structure ENREGISTREMENT :
struct ENREGISTREMENT
{
    int id;               
    std::string login;    
    std::string pass;     
    std::string email;    
    std::string site;     
};

LogFile lf;
ENREGISTREMENT e = lf[10];    //Sachant que m_nbEn<10 (voir l'implémentation de la surcharge de l'op [] ). Ca foire à ce niveau là

alors que ce code marche :

LogFile lf;
cout << lf[10].id << endl;   //affiche -1 (voir là encore l'implémentation de la surcharge de [])

celui ci par contre fait planter méchament la console :

LogFile lf;
cout << lf[10].login << endl;     //Devrait afficher " " mais il n'en est rien

Une idée mes braves ?
Commenter la réponse de julien_boss
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
0
Merci
Merci tout fonctionne
Commenter la réponse de julien_boss