Überladung der Operatoren << und >>
-
Hallo Leute.
Ich habe versucht in einer Klasse die Ein und Ausgabe Operatoren << und >> zu überladen. Ich Hab folgenden Code da stehen:Deklaration:
class Quadrat { private: ... public: ... friend ostream& operator <<(ostream& os, const Quadrat& val); friend istream& operator >>(istream& is, Quadrat& val); ... };
Definition
#include <iostream> #include "Quadrat.hpp" using namespace std; ... ostream Quadrat::operator <<(ostream& os, const Quadrat& val) { os << "Kantenlaenge: " << val.a << '\n'; os << "Flaeche: " << val.A << '\n'; } istream& Quadrat::operator >>(istream& is, Quadrat& val) { cout << "Laenge der Kante \"a\" angeben: "; is >> val.a; } ...
Folgende Fehler meldungen:
ISO C++ forbids declaration of `ostream' with no type
ostream' is neither function nor member function; cannot be declared friendISO C++ forbids declaration of
istream' with no type
istream' is neither function nor member function; cannot be declared friendDanke im Voraus!
Gruß, Wikinger75!
-
Ich hab den Code mal kommentiert:
class Quadrat { private: ... public: ... friend ostream& operator <<(ostream& os, const Quadrat& val); //friend decl friend istream& operator >>(istream& is, Quadrat& val); //friend decl ... }; ostream& operator <<(ostream& os, const Quadrat& val); //decl. muss freie Funktion sein! istream& operator >>(istream& is, Quadrat& val); //decl. muss freie Funktion sein!
Definition
#include <iostream> #include "Quadrat.hpp" using namespace std; ... ostream& operator <<(ostream& os, const Quadrat& val) //& fehlte bei Return-Type, und operator<< KEIN Member von Quadrat { os << "Kantenlaenge: " << val.a << '\n'; os << "Flaeche: " << val.A << '\n'; } istream& operator >>(istream& is, Quadrat& val) //siehe oben { cout << "Laenge der Kante \"a\" angeben: "; is >> val.a; } ...
-
Habs jetzt genauso da stehen wie du doch es geht immer noch net.
Fehlermeldungen:
Immer noch die selben.
-
Im Header fehlt der namespace.
-
Schreib im Header
std::ostream
, aber schreib auf keinen Fallusing namespace std;
in den Header!<ostream>
muss natürlich auch eingebunden sein (geht auch über<iostream>
).
-
geht immer noch nicht.
Habs in der Header kein using namespace std, nur in der cpp.
Es geht immer noch nicht.In function `std::istream& operator>>(std::istream&, Quadrat&)':
[Warning] no return statement in function returning non-void
-
Dann lies mal die Fehlermeldung (obwohl das ja lediglich eine Warnung ist..)
Da fehlt der Rückgabewert. Tachyon hat ja nur gezeigt, wie die Schnittstelle geht. Den Rest musst du selbst auch noch machen!
Hier zum Einfügen:
- return os;
- return is;
Im übrigen solltest du den Compiler wechseln. Ein fehlendes return sollte in diesem Falle einen Error geben.
-
In function `std::ostream operator<<(std::ostream&, const Quadrat&)':
new declaration `std::ostream operator<<(std::ostream&, const Quadrat&)'
ambiguates old declaration `std::ostream& operator<<(std::ostream&, const Quadrat&)'
In copy constructor `std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)':
`std::ios_base::ios_base(const std::ios_base&)' is private
within this context
sagt der^^
soll ich mal den gesamten code posten den ich bisher habe?
-
Quadrat.hpp
#ifndef QUADRAT_HPP_ #define QUADRAT_HPP_ #include <iostream> class Quadrat { private: double a; double A; public: Quadrat(double KantenLaenge); double getA(); void setA(double Laenge); double CalculateArea(); void Spend(); friend std::ostream& operator <<(std::ostream& os, const Quadrat& val); friend std::istream& operator >>(std::istream& is, Quadrat& val); }; #endif
Quadrat.cpp
#include <iostream> #include "Quadrat.hpp" using namespace std; Quadrat::Quadrat(double KantenLaenge) { a = KantenLaenge; } double Quadrat::getA() { return a; } void Quadrat::setA(double Laenge) { a = Laenge; } double Quadrat::CalculateArea() { A = a*a; return A; } void Quadrat::Spend() { cout << CalculateArea() << endl; } ostream operator <<(ostream& os, const Quadrat& val) { os << "Kantenlaenge: " << val.a << '\n'; os << "Flaeche: " << val.A << '\n'; return os; } istream& operator >>(istream& is, Quadrat& val) { cout << "Laenge der Kante \"a\" angeben: "; is >> val.a; return is; }
-
Zum selbst einfügen:
- &
-
Danke Leute^^
Habs erst jetzt gesehen, tja als Anfänger macht mat komische Tipfehler xD.