kleines c++ problem mit ostream << operator

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/kleines-c-problem-mit-ostream-operator_224799/page_1 - zur Vollversion wechseln!


Bunny schrieb am 24.06.2011 um 20:50

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 schrieb am 24.06.2011 um 20:59

Boah lange her. Ich glaube du Referenzierst "operator" falsch.
Probier "friend ostream &operator"..


Bunny schrieb am 24.06.2011 um 21:01

nein, das ist ganz egal... das ist es nicht...


that schrieb am 24.06.2011 um 22:59

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 schrieb am 24.06.2011 um 23:24

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 schrieb am 24.06.2011 um 23:28

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 schrieb am 25.06.2011 um 02:27

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


Bunny schrieb am 25.06.2011 um 13:04

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 ?


Spikx schrieb am 25.06.2011 um 14:38

Zitat von Bunny
EDIT: wie darf ich das verstehn mit der endlosrekursion ?
Wenn du Kreis::operator<< aufrufst, wird darin Kreis::operator<< aufgerufen.


that schrieb am 25.06.2011 um 18:53

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 schrieb am 25.06.2011 um 18:59

@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 schrieb am 27.06.2011 um 15:03

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 schrieb am 27.06.2011 um 15:31

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 schrieb am 27.06.2011 um 15:40

danke für den Tipp, funktioniert aber trotzdem nicht.. die Fehlermeldung ändert sich nicht.


PuhBär schrieb am 27.06.2011 um 16:09

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025