kleines c++ problem mit ostream << operator
Bunny 24.06.2011 - 20:50 5866 25
Bunny
Addicted
|
Halloo, ich spiele mich derzeit mit c++ und Qt. Hab c++ in der Schule und wollte jetzt einfach mal zur Wiederholung einfach ein Beispiel machen das nicht wirklich Sinn machen muss. Hauptsache dabei ist das ich eine Klasse verwende. Jetzt hab ich gerade ein Problem mit dem Schiebeoperator " << " .... genauer gesagt mit dieser Zeile: friend ostream& operator <<(ostream &os,const Kreis); // << Operator funktioniert nicht!!!
Der Compiler gibt folgendes aus: 'ostream' does not name a type.Diese Fehlermeldung betrifft die header Datei. Die zweite Fehlermeldung betrifft das Hauptprogramm: No match for 'operator<<' in 'std::cout << test'Hier mal meine rechnen.h Datei : #ifndef RECHNEN_H
#define RECHNEN_H
#define PI 3.14159256
class Kreis
{
public:
Kreis();
Kreis(double radius);
int getRadius();
int getDurchmesser();
void getFlaeche(); // Flaechenberechnung
friend ostream& operator <<(ostream &os,const Kreis); // << Operator funktioniert nicht!!!
private:
double r;
double d;
};
#endif // RECHNEN_H
und hier der teil aus der rechnen.cpp : ostream& operator <<(ostream &os,const Kreis)
{
os << Kreis;
return os;
}
Ich denk mal das es nur eine Kleinigkeit sein wird. Ich komm halt nur nicht drauf xD . Vlt kann mir jemand von euch helfen ? LG
|
Obermotz
Fünfzylindernazi
|
Boah lange her. Ich glaube du Referenzierst "operator" falsch. Probier "friend ostream &operator"..
|
Bunny
Addicted
|
nein, das ist ganz egal... das ist es nicht...
|
that
ModeratorHoffnungsloser Optimist
|
Fangen wir beim Einfachen an:
Wo ist dein "#include <ostream>"? Und wo ist "using namespace std"?
Zu deiner zweiten Fehlermeldung fehlt der Sourcecode - wenn du dazu Hilfe erwartest, dann poste den ganzen Code, der nicht funktioniert - idealerweise so reduziert wie möglich.
|
Esh
Bloody Newbie
|
ostream& operator <<(ostream &os,const Kreis)
-> const Kreis? müsste das nicht "const Kreis kreis" oder so sein? typ und dann der name der var?
|
that
ModeratorHoffnungsloser Optimist
|
ostream& operator <<(ostream &os,const Kreis)
-> const Kreis? müsste das nicht "const Kreis kreis" oder so sein? typ und dann der name der var? In der Deklaration muss das nicht unbedingt sein, in der Definition wirds dann notwendig sein, wenn man den Parameter auch irgendwie ansprechen will. Aber dort gehört eh auch noch die Endlosrekursion weg.
|
watchout
Legendundead
|
1. Wenn du << als friend Deklarierst, musst du es imho auch als friend definieren => compilest du mit -Wall?
2. Der 2. Parameter von << muss imho ein Pointer sein, also "const Kreis&"
3. Wie that schon geschrieben hat, hast du eine Endlosrekursion
Bearbeitet von watchout am 25.06.2011, 02:31
|
Bunny
Addicted
|
hier ist meine main.pp : #include <QtCore/QCoreApplication>
#include <iostream>
#include <math.h>
#include <rechnen.h>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Kreis test(5);
cout << test;
return a.exec();
}
#include <ostream> brauch ich nicht, meines wissens, da ich ja eh die iostream hab. EDIT: wie darf ich das verstehn mit der endlosrekursion ?
Bearbeitet von Bunny am 25.06.2011, 13:08
|
Spikx
My Little Pwny
|
EDIT: wie darf ich das verstehn mit der endlosrekursion ? Wenn du Kreis: perator<< aufrufst, wird darin Kreis: perator<< aufgerufen.
|
that
ModeratorHoffnungsloser Optimist
|
hier ist meine main.pp :
#include <QtCore/QCoreApplication>
#include <iostream>
#include <math.h>
#include <rechnen.h>
using namespace std;
Der Compiler sieht also zuerst dein .h-File und dann erst "using namespace std". Kein Wunder, dass er da "ostream" nicht kennt. Schreib "std: stream", dann sollte das gehen.
|
Dargor
Shadowlord
|
@that: das sollte egal sein, wo das namespace steht bzw. machts sogar sinn, es nachher zu schreiben, da man es in den headern nicht verwenden soll, sondern std::bla edit: la di da... sorry
|
Bunny
Addicted
|
also ich komm nicht weiter... ich hab schon so viel herum gespielt... und verstehen tuh ich es immer noch nicht was mit der endlosrekursion sein soll...
ich erkenns anscheinend nicht ... ^^ kann mir jemand ein beispiel/pseudo code posten ?
|
PuhBär
Schau ned so genau
|
Du rufst im Streamoperator wieder den Streamoperator auf. Stattdessen gib dort einfach die Daten die du streamen willst aus. Der 2. Parameter sollte glaub ich eine const-Referenz sein. ostream& operator << (ostream& os, const Kreis& kreis)
{
os << "Radius: " << kreis.getRadius();
return os;
}
|
Bunny
Addicted
|
danke für den Tipp, funktioniert aber trotzdem nicht.. die Fehlermeldung ändert sich nicht.
|
PuhBär
Schau ned so genau
|
Machmal das:
1. Inkludiere im .h-File <iostream> 2. Mach die Funktionen getRadius() und getDurchmesser() const 3. Zieh den stream Operator aus der Klasse heraus (friend kannst dann entfernen) und prefixe ostream mit std::
Bei mir kompiliert das.
|