Question

C'est peut-être une question de novice, mais je ne peux pas le résoudre en inspectant le livre que j'ai. Le constructeur de la classe initialise deux doubles et je souhaite que le code suivant produise ces deux doubles avec < <.

Complex x( 3.3, 1.1 );

cout << "x: " << x;

Après cela, je dois surcharger > > d'accepter deux doubles dans ceux-ci. C’est la première fois que je vous pose cette question. Si les informations fournies me manquent, informez-moi

EDIT: J'ai maintenant pour le constructeur et l'instruction de surcharge ceci:

#include "Complex.h"

Complex::Complex( double realPart, double imaginaryPart )
: real( realPart ),
imaginary( imaginaryPart )
{

}

std::istream& operator>>(std::istream& strm, const Complex &c)
{
   double r,i;
   strm >> r >> i;
   c = Complex(r,i);
   return strm;
}

Je sais que je dois modifier le "const Complex & amp; c". et le "c = complexe (r, i);" mais je ne suis pas sûr de savoir comment s'y prendre. De plus, je dirai ici qu'il ne s'agit pas de la classe complexe de la bibliothèque std, bien qu'elle repose sur la même idée. Jusqu'à présent, tout le monde a été d'une grande aide, mais j'ai un cas de stupide aujourd'hui.

Était-ce utile?

La solution

opérateur < < :

std :: cout est un objet std :: ostream , vous devez donc surcharger l'opérateur < < pour ostream , qui prend en argument std :: complex < double > , en supposant que vous utilisiez std :: complex < double > à partir du complexe d'en-tête standard. Etant donné que vous ne devez pas apporter de modifications internes aux conteneurs et aux classes standard, rendez-le autonome.

#include <iostream>
#include <complex>

std::ostream& operator<<(std::ostream& strm, const std::complex<double>& c)
{
    strm << "real: " << c.real() << "imag: " << c.imag();
    return strm;
}

opérateur > > :

, l'opérateur > > prend un objet std :: istream , qui fait l'inverse de ce que std :: ostream fait. Si vous utilisez de tels flux pour la sérialisation, il est également judicieux d'activer les exceptions pour ces derniers. Habituellement, vous voulez seulement lancer std :: ios :: badbit .

#include <iostream>
#include <complex>

std::istream& operator>>(std::istream& strm, std::complex<double>& c)
{
    double r,i;
    strm >> r >> i;
    c = std::complex<double>(r,i);
    return strm;
}

Si vous aviez besoin d'accéder aux membres internes de la classe, définissez la fonction surchargée en tant qu'ami. Mais puisque std :: complex :: real () et std :: complex :: imag () font partie de l'interface publique, ce n'est pas nécessaire ici. Et pour l'exemple istream, nous appelons simplement le constructeur de copie, qui fait également partie de l'interface publique.

J'ai supposé que vous vouliez utiliser cin et cout ici. Mais si vous vouliez surcharger les opérateurs pour autre chose, il en va de même. Si vous implémentez les opérateurs dans une définition de classe, vous avez accès au pointeur this . La fonction d'opérateur ne doit donc prendre qu'un seul argument.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top