"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

kleines c++ problem mit ostream << operator

Bunny 24.06.2011 - 20:50 5866 25
Posts

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
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:

Code: CPP
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 :

Code: CPP
#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 :

Code: 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
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Boah lange her. Ich glaube du Referenzierst "operator" falsch.
Probier "friend ostream &operator"..

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
nein, das ist ganz egal... das ist es nicht...

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
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
Registered: May 2010
Location: Wien
Posts: 18
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

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Zitat von Esh
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
hier ist meine main.pp :

Code: CPP
#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
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Zitat von Bunny
EDIT: wie darf ich das verstehn mit der endlosrekursion ?
Wenn du Kreis::operator<< aufrufst, wird darin Kreis::operator<< aufgerufen.

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Zitat von Bunny
hier ist meine main.pp :

Code: CPP
#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::ostream", dann sollte das gehen.

Dargor

Shadowlord
Avatar
Registered: Sep 2006
Location: 4020
Posts: 2071
@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... :D sorry

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
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
Avatar
Registered: Sep 2002
Location: .
Posts: 1228
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.

Code: CPP
ostream& operator << (ostream& os, const Kreis& kreis) 
{ 
    os << "Radius: " << kreis.getRadius(); 
    return os; 
} 

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
danke für den Tipp, funktioniert aber trotzdem nicht.. die Fehlermeldung ändert sich nicht.

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1228
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz