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 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
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]);
}
}
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
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'
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'
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'
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
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.
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.