Bonjour je cherche un moyen pour surcharger une classe Tableau avec l'operateur [] de façon a pouvoir faire
Mais je ne vois vraiment pas comment faire :?Code:
1
2
3
4 valeur = tableau[ligne][colonne]; //mais aussi: tableau[ligne][colonne] = valeur;
Version imprimable
Bonjour je cherche un moyen pour surcharger une classe Tableau avec l'operateur [] de façon a pouvoir faire
Mais je ne vois vraiment pas comment faire :?Code:
1
2
3
4 valeur = tableau[ligne][colonne]; //mais aussi: tableau[ligne][colonne] = valeur;
Ce n'est pas possible directement.
Néanmoins 2 possibilités:
1) surcharger l'opérateur () avec 2 paramètres, l'accès à un élément devient donc X(i,j)
2) Passer par une classe proxy.
L'opérateur [] de ta matrice renvoyant une class proxy intermédiaire représentant un vecteur.
Ta classe vecteur ayant elle même un opérateur [] pour l'accès à un élément.
La 2ème méthode est plus délicate à mettre en oeuvre de manière efficace.
Chaque méthode a ses avantages et inconvénients.
Une bibliothèque complète proposera les deux...
Faire un proxy demande de la technique pour ne pas perdre en vitesse d'exécution par rapport à la méthode de calcul direct de la surcharge de l'opérateur ().Citation:
Envoyé par Aszarsha
Et je suppose que jpcohen ne connaît justement pas cette méthode puisqu'il n'a pas envisagé cette possibilité.
En général plutôt que de surcharger l'opérateur [], on propose des fonctions aux noms plus explicites pour accéder aux lignes/colonnes.
Désolé de te décevoir mais j'étais partis sur une méthode de proxy sans savoir que ça s'appelait comme ça :p Ce qui d'ailleur m'a conforté dans mon idée ^^
Maintenant c'est clair qu'étant donné mon niveau ça doit pas etre super optimisé ^^ Enfin je fais au possible je verrais ce que ça donne déja à la compilation du projet.
Par contre si tu as des "trucs" pour augmenter la vitesse d'execution, que je pourrais metre en pratique, je suis preneur.
En tout cas merci a toi.
Ca dépend de ton implémentation de matrice.Citation:
Envoyé par jpcohen
Dans l'ensemble les trucs sont:
-inliner tout
-calculer et stocker les offset dès la création de la classe proxy
-aucune copie de contenu pour la classe proxy, donc utilisation de références et/ou pointeurs
Et il n'est pas interdit de comparer les perfs des 2 méthodes.
Grâce au stockage des offsets, cette méthode est généralement plus rapide quand plusieurs accès mémoires consécutifs sont faits sur le même proxy.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 template<class T> class matrix_row { ... }; template<class V> class matrix { typedef V value_type; ... typedef matrix_row<matrix > row_type; typedef matrix_row<const matrix> const_row_type; ... row_type row(int i) { return row_type (*this,i); } const_row_type row(int i) const { return const_row_type(*this,i); } };
Ok, joli bout de code.
Merci pour ton aide ;-)
La premiere méthode est décrite dans la faq cpp et je pense que tu te ferra beaucoup moins suer pour un résultat vraiment intuitif et rapide (je pense que c'est ton but).