Frage

Dies kann ein Anfänger Frage, aber ich kann es nicht durch Inspektion des Buches heraus ich habe. Konstruktor der Klasse initialisiert zwei Doppelzimmer, und ich möchte den folgenden Code zur Ausgabe die beiden Doppel mit <<.

Complex x( 3.3, 1.1 );

cout << "x: " << x;

Danach muss ich überlasten auf >> zwei Doppelzimmer in diese akzeptieren. Dies ist meine erste Frage hier, also, wenn meine Informationen zur Verfügung gestellt mir fehlen informieren

EDIT: Ich habe jetzt für den Konstruktor und Überlastungen Aussage dieser:

#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;
}

Ich weiß, ich habe das "const Complex & c" ändern und das "c = Complex (r, i);" aber ich bin nicht sicher, wie es geht. Auch werde ich hier sagen, dass dies nicht über die std Bibliothek Complex Klasse, obwohl es auf der gleichen Idee basiert. Bisher jeder hat eine große Hilfe, aber ich habe einen Fall von den stummen heute.

War es hilfreich?

Lösung

operator <<:

std::cout ist ein std::ostream Objekt, so müssen Sie operator<< für ostream überlasten, die als Argument std::complex<double> nehmen, vorausgesetzt, Sie std::complex<double> aus dem Standard-Header-Komplex verwenden. Da Sie nicht interne Änderungen an Standardcontainer und Klassen machen sollten, machen es standalone.

#include <iostream>
#include <complex>

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

Operator >>:

operator>> nimmt ein std::istream Objekt, das macht das Gegenteil von dem, was std::ostream tut. Wenn Sie Ströme für die Serialisierung wie folgt verwenden, ist es eine gute Idee, um Ausnahmen für sie zu ermöglichen. Normalerweise wollen Sie nur auf std::ios::badbit werfen.

#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;
}

Wenn Sie den Zugriff auf interne Mitglieder der Klasse benötigt werden, würden Sie die überladene Funktion als Freund definieren. Aber da std :: Komplex :: real () und std :: Komplex :: imag () ein Teil der öffentlichen Schnittstelle ist, ist, dass hier nicht benötigt. Und für das istream Beispiel haben wir einfach den Copy-Konstruktor aufrufen, die auch ein Teil der öffentlichen Schnittstelle.

Ich nahm man wollte hier cin und cout verwenden. Aber wenn man die Operatoren für etwas anderes zu überlasten wollte, gilt das gleiche. Wenn Sie die Operatoren innerhalb einer Klassendefinition implementieren, haben Sie Zugriff auf den this Zeiger haben, damit die Bedienfunktion nur ein Argument nehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top