OVH Cloud OVH Cloud

surcharge opérateur '[ ]'

4 réponses
Avatar
Nicolas Aunai
bonjour,


j'ai une classe dans laquelle se trouve un vector privé. j'aimerai
cependant effectuer des opérations sur les éléments de ce vector depuis
l'extérieur.

exemple :

class A
{

private:
vector <obj> tab;

public:
operation(obj&);
unsigned int taille();
}



depuis l'extérieur j'aimerai faire :

A obj_a;

for(int i=0; i< a.taille(); i ++)
A[i].operation();


où j'aurai l'opérateur surchargé [] qui me renverrai un iterator a la
position 'i' de mon vector, est-ce possible ? si oui comment ?

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

4 réponses

Avatar
Nicolas Aunai
"Nicolas Aunai" a formulé ce samedi :


A obj_a;

for(int i=0; i< a.taille(); i ++)
A[i].operation();



a[i].operation()
bien sûr

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Loïc Joly
Nicolas Aunai wrote:

bonjour,


j'ai une classe dans laquelle se trouve un vector privé. j'aimerai
cependant effectuer des opérations sur les éléments de ce vector depuis
l'extérieur.

exemple :

class A
{

private:
vector <obj> tab;

public:
operation(obj&);
unsigned int taille();
}



depuis l'extérieur j'aimerai faire :

A obj_a;

for(int i=0; i< a.taille(); i ++)
A[i].operation();


où j'aurai l'opérateur surchargé [] qui me renverrai un iterator a la
position 'i' de mon vector, est-ce possible ? si oui comment ?


J'ai du mal à voir comment tu comptes appliquer la fonction operation
sur l'objet que retournera l'opérateur []. Si cet objet est de type obj
ou apparenté, il ne connait pas "operation", s'il est du type A, ça n'a
pas avancé le schmilblick.

Si vraiment tu veux cette syntaxe, tu vas devoir écrire un objet
intermédiaire :

class Proxy
{
A &myA;
obj &myObj;
Proxy(A &a, obj &obj_) : myA(a), myObj(obj_) {}
operation(){myA.operation(myObj);};
};

et alors, tu ajoutes à A :
class A
{
// ...
ObjAndARef operator[] (unsigned int i)
{
return Proxy(*this, tab[i]);
}
}

--
Loïc

Avatar
Nicolas Aunai
"Loïc Joly" a exprimé avec précision :


J'ai du mal à voir comment tu comptes appliquer la fonction operation sur
l'objet que retournera l'opérateur []. Si cet objet est de type obj ou
apparenté, il ne connait pas "operation", s'il est du type A, ça n'a pas
avancé le schmilblick.


je me suis en effet trompé, la méthode 'operation' se trouve dans la
classe de 'obj'

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Loïc Joly
Nicolas Aunai wrote:

"Loïc Joly" a exprimé avec précision :


J'ai du mal à voir comment tu comptes appliquer la fonction operation
sur l'objet que retournera l'opérateur []. Si cet objet est de type
obj ou apparenté, il ne connait pas "operation", s'il est du type A,
ça n'a pas avancé le schmilblick.



je me suis en effet trompé, la méthode 'operation' se trouve dans la
classe de 'obj'


Dans ce cas là, c'est bien plus simple, il suffit de fournir :

class A
{
// ...
obj &operator [](int i) {return tab[i];}
obj const &operator [](int i) const {return tab[i];}
};

La deuxième méthode étant utile quand on a un objet A constant.

--
Loïc