C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Redefinition de l'operateur []

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Eric Jacoboni
Guest





PostPosted: Mon Feb 06, 2006 9:02 pm    Post subject: Redefinition de l'operateur [] Reply with quote



Bonjour,

Après avoir fouillé dans pas mal de docs, je n'ai toujours pas trouvé
de réponse à un problème "apparemment simple" :

Je prend un exemple soumis par un collègue, auquel je n'ai pas su
répondre :

Soit une classe Vecteur_Creux sensée représenter un vecteur creux. On
veut redefinir [] de sorte qu'on puisse accéder assez naturellement à
un élément par son "indice" ou que l'élément indicé puisse servir de
lvalue.

Le "problème" est qu'il faudrait pouvoir distinguer le cas où cet
opérateur est appelé "en lecture" et le cas où il l'est en écriture
car le traitement n'est pas le même dans les deux cas (coup classique
des vecteurs creux lors de l'affectation d'un élément, notamment).

Je ne sais pas si je me fais bien comprendre, donc je prend un exemple
avec un autre langage où, là, je sais faire :

def [](indice)
# appelée par une instruction comme "if machin[10]" ou
# "truc = machin[2]"
end

def []=(indice)
# appelée par une instruction comme "machin[10] = 12"
end

Il reste bien sur l'option consistant à définir deux méthodes portant
des noms comme get ou set... Le problème n'est pas tant d'y arriver
que de de savoir s'il y a une solution avec une redéfinition de [].


--
Eric Jacoboni, ne il y a 1442696510 secondes
Back to top
Loïc Joly
Guest





PostPosted: Mon Feb 06, 2006 9:02 pm    Post subject: Re: Redefinition de l'operateur [] Reply with quote



Eric Jacoboni a écrit :
Quote:
Bonjour,

Après avoir fouillé dans pas mal de docs, je n'ai toujours pas trouvé
de réponse à un problème "apparemment simple" :

Je prend un exemple soumis par un collègue, auquel je n'ai pas su
répondre :

Soit une classe Vecteur_Creux sensée représenter un vecteur creux. On
veut redefinir [] de sorte qu'on puisse accéder assez naturellement à
un élément par son "indice" ou que l'élément indicé puisse servir de
lvalue.

Le "problème" est qu'il faudrait pouvoir distinguer le cas où cet
opérateur est appelé "en lecture" et le cas où il l'est en écriture
car le traitement n'est pas le même dans les deux cas (coup classique
des vecteurs creux lors de l'affectation d'un élément, notamment).

Il n'est pas possible de différentier directement lecture ou écriture
avec l'opérateur []. Par contre, en ajoutant le célèbre niveau
d'indirection supplémentaire...

Tu fais retourner à ton opérateur [] non pas un double, mais une classe.
Cette classe retiens en mémoire le vecteur creux et l'indice
correspondant à ce qui a été demandé. Cette classe se comporte
globalement comme un double, mais par contre, affecter une valeur à
cette classe lui fait appeler la fonction qui va bien du vecteur creux.

--
Loïc
Back to top
Franck Branjonneau
Guest





PostPosted: Mon Feb 06, 2006 9:02 pm    Post subject: Re: Redefinition de l'operateur [] Reply with quote



Eric Jacoboni <jaco (AT) neottia (DOT) net> écrivait:

Quote:
Soit une classe Vecteur_Creux sensée représenter un vecteur creux. On
veut redefinir [] de sorte qu'on puisse accéder assez naturellement à
un élément par son "indice" ou que l'élément indicé puisse servir de
lvalue.

Le "problème" est qu'il faudrait pouvoir distinguer le cas où cet
opérateur est appelé "en lecture" et le cas où il l'est en écriture
car le traitement n'est pas le même dans les deux cas (coup classique
des vecteurs creux lors de l'affectation d'un élément, notamment).

operator[](int) et operator[](int) const ne conviennent pas ?

--
Franck Branjonneau
Back to top
Eric Jacoboni
Guest





PostPosted: Mon Feb 06, 2006 10:02 pm    Post subject: Re: Redefinition de l'operateur [] Reply with quote

Loïc Joly <loic.actarus.joly (AT) numericable (DOT) fr> writes:

Quote:
Il n'est pas possible de différentier directement lecture ou écriture
avec l'opérateur []. Par contre, en ajoutant le célèbre niveau
d'indirection supplémentaire...

Ah, donc cela confirme mes supputations.

Quote:
Tu fais retourner à ton opérateur [] non pas un double, mais une
classe. Cette classe retiens en mémoire le vecteur creux et l'indice
correspondant à ce qui a été demandé. Cette classe se comporte
globalement comme un double, mais par contre, affecter une valeur à
cette classe lui fait appeler la fonction qui va bien du vecteur
creux.

Ok, merci. Je vais transmettre ça à l'intéressé.

--
Eric Jacoboni, ne il y a 1442703458 secondes
Back to top
Loïc Joly
Guest





PostPosted: Mon Feb 06, 2006 10:02 pm    Post subject: Re: Redefinition de l'operateur [] Reply with quote

Franck Branjonneau a écrit :
Quote:
Eric Jacoboni <jaco (AT) neottia (DOT) net> écrivait:


Soit une classe Vecteur_Creux sensée représenter un vecteur creux. On
veut redefinir [] de sorte qu'on puisse accéder assez naturellement à
un élément par son "indice" ou que l'élément indicé puisse servir de
lvalue.

Le "problème" est qu'il faudrait pouvoir distinguer le cas où cet
opérateur est appelé "en lecture" et le cas où il l'est en écriture
car le traitement n'est pas le même dans les deux cas (coup classique
des vecteurs creux lors de l'affectation d'un élément, notamment).


operator[](int) et operator[](int) const ne conviennent pas ?

On peut très bien vouloir accèder en lecture à un conteneur non constant.

--
Loïc
Back to top
kanze
Guest





PostPosted: Tue Feb 07, 2006 9:02 am    Post subject: Re: Redefinition de l'operateur [] Reply with quote

Loïc Joly wrote:
Quote:
Eric Jacoboni a écrit :

Après avoir fouillé dans pas mal de docs, je n'ai toujours
pas trouvé de réponse à un problème "apparemment simple" :

Je prend un exemple soumis par un collègue, auquel je n'ai
pas su répondre :

Soit une classe Vecteur_Creux sensée représenter un vecteur
creux. On veut redefinir [] de sorte qu'on puisse accéder
assez naturellement à un élément par son "indice" ou que
l'élément indicé puisse servir de lvalue.

Le "problème" est qu'il faudrait pouvoir distinguer le cas
où cet opérateur est appelé "en lecture" et le cas où il
l'est en écriture car le traitement n'est pas le même dans
les deux cas (coup classique des vecteurs creux lors de
l'affectation d'un élément, notamment).

Il n'est pas possible de différentier directement lecture ou
écriture avec l'opérateur []. Par contre, en ajoutant le
célèbre niveau d'indirection supplémentaire...

Tu fais retourner à ton opérateur [] non pas un double, mais
une classe. Cette classe retiens en mémoire le vecteur creux
et l'indice correspondant à ce qui a été demandé. Cette classe
se comporte globalement comme un double, mais par contre,
affecter une valeur à cette classe lui fait appeler la
fonction qui va bien du vecteur creux.

C'est classe s'appelle un proxy, et son utilisation, comme
décrit ici, est le modèle de proxy.

En fait, pour être plus clair : on utilise un opérateur de
conversion implicit (« operator double() const ») pour la
conversion en rvalue. En revanche, il faut bien fournir tous les
opérations lvalue -- la classe aurait donc un
« operator=(double) const » pour l'affectation. (Et oui,
l'opérateur d'affectation est const, parce qu'il ne change pas
l'état de l'objet -- qui n'est qu'un proxy -- mais celui du
vecteur.)

Pour double, selon le cas, on pourrait aussi vouloir fournir les
opérateurs du genre +=, -=, etc., de façon à pouvoir écrire
« v[i] += 2.5 ».

Pour les objets de type classe, c'est plus délicat. Une des
opérations prémordial sur un lvalue de type classe, c'est .,
e.g. lvalue.f(). Et on ne peut pas surcharger l'opérateur ..

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.