NOMBRES COMPLEXES - COMPLEX NUMBERS

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 11 août 2011 à 15:56
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 11 août 2011 à 16:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53455-nombres-complexes-complex-numbers

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
11 août 2011 à 16:31
Hello,
Idem que CptPingu: pas d'originalité comparé au autre code présent sur le site.
Une petite erreur de frappe dans le main:
if(c4 == c1)
cout << "No Equality" << endl;
--> si c'est égal alors...ce n'est pas égal :D
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 août 2011 à 16:14
C'est bien de faire un: Complex *c3 = new Complex(3,3);
Mais le "delete c3;", il est où ?
imed07 Messages postés 5 Date d'inscription dimanche 25 février 2007 Statut Membre Dernière intervention 11 février 2012
11 août 2011 à 16:11
Elle est ou la fuite mémoire ?
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 août 2011 à 15:56
Quel est l'intérêt de cette classe par rapport à un vrai std::complex (dans #include <complex>) ?

Le code est parfois inélégant, la classe n'est pas très poussée (pas de template, donc pas de choix du type à utiliser). On est très très loin de la propreté et de l'élégance du type "complex" de la STL.

Critique du code:
- Évite les using namespace, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- On évite généralement d'utiliser this->, puisqu'il est inutile. On écrit un attribut de classe avec un différencieur. Ex: double real; => double _real;
this-> est utile en PHP, et souvent utilisé en Java. Le C++ n'est ni du PHP ni du Java.
- En C++ un header prend l'extension .hh ou .hpp, le .h étant réservé au C.
- Dans un constructeur on utilise la liste d'initilisation dès que possible, plutôt que de tout assigner dans le corps du constructeur.
- Lorsque l'on est dans une classe, on peut accéder de manière publique aux membre d'une autre classe de même type. Donc this->imaginary*c.getImaginary(); => _imaginary * c._imaginary;
- Lorsque l'on a un booléen, il suffit de le retourner, inutile de vérifier si vrai est vrai, ou si faux est bien faux...if ((this->real c.getReal()) && (this->imaginary c.getImaginary()))
return true;
return false;
> devient en propre:return _real c._real && _imaginary c._imaginary;
- Parenthèses inutiles, si tu connais la priorité des opérateurs...
- Un main propre ce n'est pas: "void main()" mais "int main()". Je te rappelle que la plupart es OS se servent de la valeur de retour du programme...
- Pas besoin de faire des milliers de cout, on peut enchainer les opérations.
Ex:
cout << "----------------" << endl;
cout << c1 << endl;
cout << c2 << endl;
cout << *c3 << endl;
cout << c1+c2 << endl;

Devient:
std::cout << "----------------\n"
<< c1 << std::endl
<< c2 << std::endl
<< *c3 << std::endl
<< c1+c2 << std::endl;

- Il y a même une fuite mémoire dans ton exemple...

Pour conclure:
* Pas d'originalité, il existe déjà des milliers de classe complex sur ce site (Merci d'ailleurs de vérifier avant de poster)
* Code pas extra-ordinaire, bourré de mauvaises pratiques
* Classe peu évolutive (un template s'y prettait pourtant bien)
* Aucun avantage par rapport à un std::complex qui est déjà dans la STL (http://www.cplusplus.com/reference/std/complex/complex/operators/)

C'est un code que je ne recommande absolument pas !
Rejoignez-nous