Operateur doublé

Operateur doublé - C++ - Programmation

Marsh Posté le 25-11-2009 à 14:36:34    

Bonjour,
je souhaiterai construire un operateur doublé qui serait du style :

Code :
  1. // .hpp
  2.   void operator [] (const int& ) operator = (const Vec& ) ;


Code :
  1. // .cpp
  2.   void GroupVec::operator [] (const int& i) operator = (const Vec& V)
  3.   {
  4.     for(int j = 0 ; j < V.size() ; ++j)
  5.     {
  6.       v[i][j] = V(j) ;
  7.     }
  8.   }


Cela permettrait de faire :

Code :
  1. // main.cpp
  2. Vec V ;
  3. GroupVec GV ;
  4. Gv[3] = V ;


 
La syntaxe que je propose ne fonctionne pas, et je n'ai rien trouvé les documentations un moyen de surcharger un opérateur doublé [] = avec deux paramètres.

Reply

Marsh Posté le 25-11-2009 à 14:36:34   

Reply

Marsh Posté le 25-11-2009 à 14:56:10    

Bebs a écrit :

Bonjour,
je souhaiterai construire un operateur doublé qui serait du style :

Code :
  1. // .hpp
  2.   void operator [] (const int& ) operator = (const Vec& ) ;


Code :
  1. // .cpp
  2.   void GroupVec::operator [] (const int& i) operator = (const Vec& V)
  3.   {
  4.     for(int j = 0 ; j < V.size() ; ++j)
  5.     {
  6.       v[i][j] = V(j) ;
  7.     }
  8.   }


Cela permettrait de faire :

Code :
  1. // main.cpp
  2. Vec V ;
  3. GroupVec GV ;
  4. Gv[3] = V ;


 
La syntaxe que je propose ne fonctionne pas, et je n'ai rien trouvé les documentations un moyen de surcharger un opérateur doublé [] = avec deux paramètres.


 
que veux tu dire par opérateur doublé ?  [:pingouino]  
 
Tu veux juste que ton opérateur [] retourne une instance de quelque chose qui supporte =, non ?
 
Edit : j'aurais du lire l'exemple !
 
Il te suffit pour ca que ton opérateur crochets retourne une référence vers l'élémenty à assigner et basta ! (et n'oublie pas de faire un opérateur constant qui te retourne une référence constante au passage)
 
Edit 2 : quelle tête a ta structure de données ? C'est un vecteur de vecteurs ?

Message cité 1 fois
Message édité par theshockwave le 25-11-2009 à 15:09:30

---------------
last.fm
Reply

Marsh Posté le 25-11-2009 à 15:22:52    

voila, retourner une référence.
Sinon c'est le DP Proxy

Reply

Marsh Posté le 25-11-2009 à 15:29:46    

theshockwave a écrit :


Edit 2 : quelle tête a ta structure de données ? C'est un vecteur de vecteurs ?


Oui, GroupVec est une sorte de "paquet" de vecteurs.
 
L'operateur [] est déjà surchargé pour faire

Code :
  1. Vec W = GroupVec[2] ;


 
Ce que j'aimerai faire, c'est fabriquer un Vec dans un coin, et le mettre dans GroupVec autrement dit, faire une affectation dans l'autre sens.

Code :
  1. Vec V ;
  2. V(0) = 2.4 ;
  3. //... fabrication de V
  4. V(3) = 4. ;
  5. GroupVec[2] = V ;


 
Voici mon opérateur crochet qui me permet d'acceder à un Vec à l'interieur d'un GroupVec :

Code :
  1. Vec GroupVec::operator [] (const int & i)
  2.   {   
  3.   Vec A(ns) ; // ns est protected dans la classe GroupVec et donne la taille des Vec
  4.     for (int ii = 0 ; ii < ns ; ++ii)
  5.     {
  6.       A(ii) = v[i][ii] ; // // v est protected dans la classe GroupVec, c'est un double**
  7.     }
  8.     return A ;
  9.   }

Reply

Marsh Posté le 25-11-2009 à 16:17:46    

Bebs a écrit :


Voici mon opérateur crochet :

Code :
  1. Vec GroupVec::operator [] (const int & i)
  2.   {   
  3.   Vec A(ns) ; // ns est protected dans la classe GroupVec et donne la taille des Vec
  4.     for (int ii = 0 ; ii < ns ; ++ii)
  5.     {
  6.       A(ii) = v[i][ii] ; // // v est protected dans la classe GroupVec, c'est un double**
  7.     }
  8.     return A ; // <----- A est local
  9.   }



 
Excusez-moi d'écrire deux messages de suite, mais je ne peux pas mettre de référence pour mon opérateur crochet car l'objet retourné est local...

Reply

Marsh Posté le 25-11-2009 à 16:20:01    

Bebs a écrit :


Oui, GroupVec est une sorte de "paquet" de vecteurs.
 
L'operateur [] est déjà surchargé pour faire

Code :
  1. Vec W = GroupVec[2] ;


 
Ce que j'aimerai faire, c'est fabriquer un Vec dans un coin, et le mettre dans GroupVec autrement dit, faire une affectation dans l'autre sens.

Code :
  1. Vec V ;
  2. V(0) = 2.4 ;
  3. //... fabrication de V
  4. V(3) = 4. ;
  5. GroupVec[2] = V ;


 
Voici mon opérateur crochet qui me permet d'acceder à un Vec à l'interieur d'un GroupVec :

Code :
  1. Vec GroupVec::operator [] (const int & i)
  2.   {   
  3.   Vec A(ns) ; // ns est protected dans la classe GroupVec et donne la taille des Vec
  4.     for (int ii = 0 ; ii < ns ; ++ii)
  5.     {
  6.       A(ii) = v[i][ii] ; // // v est protected dans la classe GroupVec, c'est un double**
  7.     }
  8.     return A ;
  9.   }



 
Ca ne te convient pas, ca ?

Code :
  1. Vec& GroupVec::operator [] (size_t i)
  2.   {   
  3.       return v[i] ;
  4.   }


 
 
Edit : les const ref sur les types genre int, c'est le mal :o

Message cité 1 fois
Message édité par theshockwave le 25-11-2009 à 16:21:04

---------------
last.fm
Reply

Marsh Posté le 25-11-2009 à 16:22:31    

Bebs a écrit :


 
Excusez-moi d'écrire deux messages de suite, mais je ne peux pas mettre de référence pour mon opérateur crochet car l'objet retourné est local...


 
Et pourquoi est-il local ? Si tu manipules un groupe de vecteurs, pourquoi choisir de stocker les infos de ces vecteurs à la main plutôt que d'avoir ... un groupe de vecteurs (std::vector, c'est bien, aussi)


---------------
last.fm
Reply

Marsh Posté le 25-11-2009 à 17:30:24    

theshockwave a écrit :


 
Ca ne te convient pas, ca ?

Code :
  1. Vec& GroupVec::operator [] (size_t i)
  2.   {   
  3.       return v[i] ;
  4.   }



 
Malheureusement, v[i] est un objet de type double* (puisque v est de type double**) et je voudrais retourner un objet de type Vec.
 

theshockwave a écrit :


 
Et pourquoi est-il local ? Si tu manipules un groupe de vecteurs, pourquoi choisir de stocker les infos de ces vecteurs à la main plutôt que d'avoir ... un groupe de vecteurs (std::vector, c'est bien, aussi)


 
Je dois créer une classe avec des objets un peu particuliers et les standards ne sont pas suffisants...

Reply

Marsh Posté le 25-11-2009 à 17:35:59    

Bebs a écrit :


Je dois créer une classe avec des objets un peu particuliers et les standards ne sont pas suffisants...


 
Je comprends bien, mais ma question était : si tu sais que ce sont des vecteurs que tu manipules dans ton conteneur (GroupVec) alors pourquoi éclater leurs composantes dans un tableau plutôt que de faire directement un tableau de "Vec" qui seront peut-être plus facile à manipuler ? Faire des copies de données dans tous les sens, ce n'est jamais une bonne idée. Quand, pour accéder simplement à la valeur d'un tableau, tu commences à devoir recopier les données, c'est mauvais signe.


---------------
last.fm
Reply

Marsh Posté le 25-11-2009 à 17:55:15    

deja arrete d'utiliser des double** et fait betement un vector<vector<double>> et renvoit des ref sur les vector interne ...

Reply

Marsh Posté le 25-11-2009 à 17:55:15   

Reply

Marsh Posté le 26-11-2009 à 10:58:01    

theshockwave a écrit :


 
Et pourquoi est-il local ? Si tu manipules un groupe de vecteurs, pourquoi choisir de stocker les infos de ces vecteurs à la main plutôt que d'avoir ... un groupe de vecteurs (std::vector, c'est bien, aussi)


 

Joel F a écrit :

deja arrete d'utiliser des double** et fait betement un vector<vector<double>> et renvoit des ref sur les vector interne ...


 
Merci. vector semble être une bonne solution.
Je pense que je vais réussir à m'en sortir.
 :hello:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed