"We are back" « oc.at

kleines c++ problem mit ostream << operator

Bunny 24.06.2011 - 20:50 5981 25
Posts

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
Hier die 3 Files die ich verwendet habe (MacOSX 10.6.8. + XCode4). Ich hab jetzt die Funktionen der Klasse Kreis auf die Schnelle gleich im h. File implementiert, wär aber besser im .cpp aufgehoben.

Kreis.h:

Code: CPP
#ifndef RECHNEN_H
#define RECHNEN_H

#define PI 3.14159256

#include <iostream>
#include <math.h>

class Kreis
{
public:
    Kreis(double radius) : r(radius) {};

    double getRadius() const { return r; }
    double getDurchmesser() const { return r * 2.0; }

    double getFlaeche() const { return PI * pow(getRadius(), 2.0); }

private:
    const double r;
};

std::ostream& operator << (std::ostream &os, const Kreis& kreis);

#endif // RECHNEN_H

Kreis.cpp:

Code: CPP
#include "Kreis.h"
#include <stdio.h>

using namespace std;

ostream& operator << (ostream &os, const Kreis& kreis)
{
    os << "Radius: " << kreis.getRadius() << endl;
    os << "Durchmesser: " << kreis.getDurchmesser() << endl;
    os << "Flaeche: " << kreis.getFlaeche() << endl;

    return os;
}

main.cpp:

Code: CPP
#include "Kreis.h"
#include <stdio.h>

using namespace std;

int main (int argc, const char * argv[])
{
    Kreis kreis(5);
    cout << kreis;

    return 0;
}

Spikx

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Zitat von Bunny
danke für den Tipp, funktioniert aber trotzdem nicht.. die Fehlermeldung ändert sich nicht.
Die Fehlermeldung hat auch nichts mit der Rekursion zu tun. Du verwendest in rechnen.h den Typ "ostream" ohne dass du ihn vorher irgendwo definiert hast. Dir fehlt dort ein
Code: CPP
#include <iostream>

using namespace std;
bzw.
Code: CPP
#include <iostream>
und dann
Code: CPP
... std::ostream ...

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
Das "using namespace std" aber bitte rausnehmen aus dem .h File

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
Hey !

ja danke, so funktionierts bei mir auch! ... is ja schon mal was :D ... ich denk mir halt nur das eigentlich nicht die Lösung ist die ich haben wollte.

Aber vorerst ist mal das Problem gelöst.. ich werde mich zwar weiterhin damit beschäftigen, aber DANKE mal!

lg

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
Dann verstehe ich aber nicht, welche Lösung du haben wolltest? :-)

Meinst du den stream Operator?

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
warum der ostream operator nicht in der klasse bleiben kann versteh ich nicht... :D

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
Den kannst eh wieder als friend in die Klasse ziehen. Allerdings bringt es halt nicht viel, weil du sowieso nicht direkt auf die private Member zugreifst vom stream Operator aus.

Den friend brauchst ja nur dann, wenn du auf private Details der Klasse ohne Getter-Funktionen zugreifen willst.

Spikx hat die Fehler eh schön zusammengefasst oben (bis auf das "using namespace std" halt, das gehört mMn nicht in ein .h File) . Den Rest deiner Lösung kannst/sollst du eh selber schreiben :-)
Bearbeitet von PuhBär am 27.06.2011, 21:41

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
na passt mal, ich sag danke an alle !!!!


lg

Spikx

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Zitat von PuhBär
(bis auf das "using namespace std" halt, das gehört mMn nicht in ein .h File)
Würd ich eh auch net machen ;)

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
Zitat von Bunny
also ich komm nicht weiter... ich hab schon so viel herum gespielt...

Du hast dir offenbar nicht einmal die Mühe gemacht, alle Antworten auf deine Frage in diesem Thread zu lesen. Solltest du eine Antwort trotz Recherche im Internet und etwas Nachdenken nicht verstehen, dann frage nach, aber ignoriere sie nicht einfach. Aber poste nie wieder etwas in der Art "ich hab ewig herumprobiert und es geht noch immer nicht" ohne genaue Angabe, was du probiert hast, und auf welche Art und Weise es genau nicht geht.

Es ist kein Einzelfall, dass du Antworten in deinen Threads ignorierst (z.B. zur Erinnerung). Sollte das nochmal vorkommen, rechne mit entsprechenden Konsequenzen.

Paxi

Overclocking Team Member
Avatar
Registered: Oct 2009
Location: Wien
Posts: 389
Es seit übrigens noch gesagt dass:
using namespace std;
nicht unbedingt der sauberste Stil ist weil es in einigen Fällen (vorallem größeren Projekten) auch vorkommt, dass man mit eigenen oder weiteren Namensräumen arbeitet.

Daher entweder immer den namespace davor schreiben:
zb.: std:: cout << ....

oder so:
using std::cout;
using std::cin; ....

cout << ...
cin >> ...
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz