Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/11/2006, à 17:20

gene69

[C++] surcharge de l'operator[]

Bonjour,
J'essaie de surcharger les opérateurs d'une classe, en particulier l'operator[] . Comme le tableau que j'accede à des propriétés particulieres j'aurrai besoin d'avoir des opérateurs différents en lecture et en écriture.

J'ai trouvé rarement des docs qui parlent de deux opérateurs... sans aller très loin. cependant lorsque que j'execute alors c'est toujours le même opérateur qui est appelé. Ce qui ne me va pas du tout.

->Comment faire pour que le compilateur comprenne quel est le bon opérateur à appeler?

un peu de code...

class Tableau {
	private:
		int* ptValeur;
		bool* ptValide;
		int utilise;
		int dimention;
		int iterateur;
		

	public:
		Tableau(Tableau& tab);
		Tableau(const int dimention = 1);
		~Tableau();

		// accesseur (affiche)
		friend ostream& operator<<(ostream& , Tableau& );
		int  operator[] ( int indice ) const; // pour la lecture ?
		int &operator[] ( int indice ); // pour l'écriture?
		
		//retournent true si réussi, false sinon.
		bool insererElementPosition(int element, const int position);
		bool supprimerElementPosition(const int position);
};

//----------------------------------------------
int& Tableau::operator [] (int indice){
	cout << "modification" << endl << endl;
	/*!valide le passage*/
	if (testerBornes(indice)){
		ptValide[indice] = true;
		return ptValeur[indice];
	}
	else{
		exit(1); // pan !
	}
}

int Tableau::operator [] (int indice) const {
	cout << "lecture" << endl << endl;
	/*!valide le passage*/
	if (testerBornes(indice)){
			return ptValeur[indice];
	}
	else{
		exit(1); // pan !
	}
}

Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#2 Le 17/11/2006, à 17:54

Cathou

Re : [C++] surcharge de l'operator[]

Tu as fait figurer le code de ta classe mais pas celui où tu l'utilises. Difficile de voir les mauvais comportements que tu incrimines hmm

A première vue, je dirais que tu as besoin d'écrire un opérateur d'affectation.

Sinon jette un oeil ICI, ça ne remplace pas un bon bouquin mais la présentation est sympa smile

#3 Le 17/11/2006, à 18:10

gene69

Re : [C++] surcharge de l'operator[]

http://www.icce.rug.nl/documents/cplusp … lus09.html
en fait je n'arrive pas à utiliser ça qui est décrit ici:
9.1: Overloading `operator[]()'

et mon mauvais anglais aidant, j'en viens à crois que c'est contradictoire avec :
http://www.bearcave.com/software/string/question.html

Merci pour le lien pour la FAC... ça fait longtemps que google me l'avait donné.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#4 Le 18/11/2006, à 02:46

Luc Hermitte

Re : [C++] surcharge de l'operator[]

Pour distinguer l'écriture de la lecture, il faut passer par une classe proxy.
Il y a alors moyen d'obtenir une solution partiellement réussie.
Scott Meyer consacre un item à cela dans son More Effective C++ (aka MEC++)

#5 Le 20/11/2006, à 01:32

gene69

Re : [C++] surcharge de l'operator[]

Je pensais bien attiré l'attention de deux programmeurs tels Luc Hermitte ou Cathou...
Bref. Je suis interessé par plus d'information sur les classes proxy. J'essaierai de trouver  le boucain à la bibliotheque (sans espoirs vu que nos documentalistes ne fonctionnent que dans la langue de Moliere).


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#6 Le 20/11/2006, à 03:19

Luc Hermitte

Re : [C++] surcharge de l'operator[]

La précédente édition du MEC++ a été traduite dans mes souvenirs -- c'est l'item 30 qui t'intéresse ici. Mais honnêtement, l'immense majorité de la bonne littérature relative au C++ est dans la langue de Shakespeare.

Le principe des classes proxy rapidement:
- une classe qui fonctionne comme une vue sur la véritable donnée
- un constructeur qui initialise la vue à partir d'une référence sur la donnée
- un opérateur d'affectation qui prend une variable du type de la donnée -- il opèrera les accès en écriture
- un opérateur de convertion pour extraire la valeur de la donnée -- l'accès en lecture quoi
- plus tout ce qui est nécessaire pour assurer une sémantique de recopie proxy->proxy
- et évidemment des accesseurs/mutateur qui renvoient des proxies correctement construits.

Par contre, en effets de bord,
* l'adresse de l'élément renvoyé par l'opérateur d'indiçage n'est plus un T* (char *p = &s1[1]; // plante) => surcharger l'opérateur & pour compenser
* plus généralement, perte de toutes les fonctions applicables sur les types encapsulés => le proxy doit proposer la même interface que celle du type encapsulé

PS: pour attirer l'attention de développeurs C++ initiés à ces arcanes, les forums spécialisés sont plus adaptés que des forums "généralistes" comme celui-ci. Enfin, je dis ça, je dis rien roll

#7 Le 20/11/2006, à 12:07

gene69

Re : [C++] surcharge de l'operator[]

Mais lorsque j'ai essayé de poster sur developpez.com (ou je sais que vous répondez aussi) le forum était aussi hs.

merci pour ses précisions.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne