 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
PRORIOL Fabien Guest
|
Posted: Sun Apr 11, 2004 12:22 pm Post subject: Re: operator@() |
|
|
En faite, je serais toi, je dériverais Vecteur de Matrice; en effet,
n'est-ce pas une matrice a une seul colonne???
µDe cette façon, M * V ; V + V ; V + M ........ tout fonctionne; biensur il
faut bien ecrire les lancement d'exception, si on essay de faire une
operation interdite (nombre de ligne et de colonne non compatible pourla
multiplication par exemple).
J'ai écrit une Template Matrice tres tres complete, dont je donnerais les
source bientot; qui jere Matrice, MatriceCarre, MatriceTriSup,
MatriceTriInf, Vector; qui contient un bon nombre d'operation et de fonction
simpa :
-reso d'equation lineaire
-Choleski
-det
-Inversion
..........
Au pire, je peut te l'envoyer en privé comme exemple.
Dans quel école tu est??
@+Fab
|
|
| Back to top |
|
 |
Anthony Fleury Guest
|
Posted: Tue Apr 13, 2004 7:22 am Post subject: Re: operator@() |
|
|
PRORIOL Fabien wrote:
| Quote: | En faite, je serais toi, je dériverais Vecteur de Matrice; en effet,
n'est-ce pas une matrice a une seul colonne???
|
Disons que cette question était plutot un pretexte pour me remettre à jour
sur les opérateurs vu que je fais rarement du C++ et plutot du C j'ai des
oublies sur des trucs simples et les vérifications dans The C++ programming
language ne suffisent pas tout le temps [au contraire parfois ca
m'embrouille même]
Et de toute facon à ce moment là ils n'avaient pas vu la dérivation en cours
(ni les exceptions) donc pas question de mettre l'un ou l'autre dans un TP
qui avait de toute facon pour but de nous faire écrire une fonction amie
entre un vecteur et une matrice, les deux n'ayant explicitement aucune
relation d'heritage entre eux, et il faut bien respecter les consignes des
TPs des profs !
Anthony - étudiant à Polytech'Grenoble
--
"I should have seen it would be this way
I should have known from the start what she's up to
When you have loved and you've lost someone
You know what it feels like to lose" -- The Rasmus
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Sat Apr 24, 2004 10:06 pm Post subject: Re: operator@() |
|
|
Anthony Fleury <fleury_anthony (AT) hotmail_ (DOT) com> writes:
| Quote: | Dans TC++PL dans l'exemple matrice, + et * sont déclarés en friend
et il est dit que "À l'inverse, si une conversion de type implicite
est désirée pour tous les opérandes d'une opération, la fonction qui
l'implémente doit être une fonction non membre recevant un argument
référence const ou un argument non référence". Je ne suis pas
vraiment sûr de bien comprendre cette phrase ?
|
Si tu veux permettre une conversion implicite pour l'opérande gauche
d'un opérateur, cet opérateur ne peut être membre. Cela voudrait dire
qu'un objet temporaire serait construit lors de la conversion, sur
lequel objet sera appelé l'opérateur, puis lequel objet sera détruit.
Que deviendront les modifications apportées par l'appel de
l'opérateur ? Et s'il s'agit d'un opérateur constant, quel opérateur
sera appelé ?
De plus, une conversion implicite ne peut être accordée lorsque le
paramètre formel est une référence. Car un objet temporaire sera créé
lors de la conversion, modifié dans le corps de la fonction, puis
détruit. Sauf s'il s'agit d'une référence constante, auquel cas la
conversion implicite peut avoir lieu.
| Quote: | Dans le cas des matrices,
matrice m1, m2;
m1+m2;
Cette opération appelera m1.operator+(m2); sans conversion implicite
à ma connaissance ? ai-je manqué quelque chose de trivial ?
|
Nop.
Quelques exemples. Le premier illustre l'interdiction d'une
conversion implicte lors de l'appel d'une fonction, pour un paramètre
formel référence non constante. Le second, le problème de la
conversion implicite sur l'opérande de gauche d'un opérateur.
void f( SomeType & st )
{
// Ici, on modifie très certainement `st', puisqu'il s'agit
// d'une référence non constante. Si l'on permettait une
// conversion implicite, `st' ferait référence à un objet
// temporaire, détruit au sortir de `f()'.
}
class C
{
:public
C & operator+=( C const & other ) ;
C const & operator+( C const & other ) ;
} ;
class D
{
:public
operator C() const ;
D & operator+=( D const & other ) ;
} ;
C const &
operator-( C const & left , C const & right ) ;
C c ;
D d ;
c += d ; // ok, conversion de l'opérande droite
d += c ; // KO, pas de conversion de l'opérande gauche
C c1 = c + d ; // ok, conversion de l'opérande droite
C c2 = d + c ; // KO, pas de conversion de l'opérande gauche
C c3 = c - d ; // ok, conversion de l'opérande droite
C c4 = d - c ; // ok, conversion de l'opérande gauche
Code non testé.
--drkm
|
|
| Back to top |
|
 |
|
|
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
|
|