Kann man ne this global über ne operatorfunktion

Gast #1308696
Lesenswert?

Kann man ne this  global über ne operatorfunktion ausgeben?

Ich hab in meine Projekt verschiedene this die ich
am liebsten global ausgeben möchte in einer Med. gehts ohne Probleme

aber ich habe mir das jetzt so Vorgestellt


void Datenbank( ){ Daten *na = this; cout << *na;}


und dann global per Operatorfunktion

direkt bekomm ich die Daten so raus

this->zahl .... this->wert1 usw
Gast #1309216
Lesenswert?

> Also auf gut deutsch kann man aus einer Klasse heraus eine globale
> OPeratorfunktion bei Stream Klassen aufrufen?

Die Antwort auf diese Frage wäre "ja", aber das ist glaube ich nicht die 
Antwort auf das, was du tatsächlich wissen willst. Wenn ich deine (immer 
noch sehr verwirrenden) Formulierungen richtig interpretiere, möchtest 
du irgendeine Funktion oder einen Operator haben, der die Namen und 
Werte aller Membervariablen einer beliebigen Klasse ausgibt. Sowas gibt 
es in C++ nicht, da die dafür nötigen Informationen nachher im Kompilat 
nicht mehr vorhanden sind.
#1309246
Lesenswert?

Rolf Magnus schrieb:

> du irgendeine Funktion oder einen Operator haben, der die Namen und
> Werte aller Membervariablen einer beliebigen Klasse ausgibt.

Wie ist eigentlich der Status von Reflection und C++ (abgesehen von 
RTTI). Vor einigen Jahren war da ja was im Gespräch. Ist da etwas draus 
geworden bzw. eine Erweiterung mitlerweile absehbar?

(Meine Glaskugel ist zwar auch nicht schlecht, aber wie du aus dem 
Gestammel die Frage nach Reflection extrahierst: Da wär ich nie drauf 
gekommen. Ich denke er sucht nach einer virtuellen Print-Funktionen, die 
er über einen Container iterierend aufrufen kann. Aber die ganze 
Fragestellung ist so verworren, dass die Frage auf alles mögliche 
abzielen kann)
Gast #1309696
Lesenswert?

was versteht ihr da nicht?

ich habe ein Interface und von dem sind mehrere Klassen abgeleitet
die einzelnen Objekte sind dann in der Klasse Con (so heist es bei mir)
zentral in einem Container list gespeichrt (sind aber Adressen die da
gespeichert sind und keine Werte)

ich bekomm jetzt die Adressen vom Iterator geliefert und je nachdem
welche adresse
er ausgibt springt er in die klassen von wem die adresse stammt und gibt 
das
in der jeweiligen klasse (überladen aus)

ist aber nicht so schon da ich ja dann in jeder klasse irgent eine 
funktion brauche die die daten dann per cout ausgibt

so meine Idee

eine zentralle globale funktion die überall als friend deklariert ist

und die dann die daten ausgibt
#1309720
Lesenswert?

Jetzt wird es doch langsam lesbarer, danke.

Was du brauchst in ein globaler Operator
1
operator<<( std::ostream &s, const deineBasisklasse &einObjekt );
2
{
3
    einObjekt.printDichSelbst( s );
4
    return s;
5
}

sowie ein virtuelle (!) Funktion void printDichSelbst( std::ostream &s )
in der Basisklasse, die in den abgeleiteten Klassen entsprechend
überladen wird.
Wenn du dann einen Iterator it auf ein Element der Liste hast, kann
man mit:
1
   std::cout << (*it);
das Ding ausgeben; ggf. wird die überladene Funktion der abgeleiteten
Klasse aufgerufen.
#1309722
Lesenswert?

ach so:
friend brauchst du auf diese Weise auch gar nicht (falls
printDichSelbst() public ist); friend ist ohnehin immer
etwas anrüchig - wenn man es braucht, hat man meist etwas
verbockt.
Möchtest du printDichSelbst() nicht public haben, sondern
protected (was sinnvoll sein kann), dann muß der operator<<
doch wieder als friend deklariert werden, sonst darf er die
Methode nicht aufrufen.

Nachtrag: vielleicht schöner beschrieben, aber i.W.
hoffentlich das Gleiche:
http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.11

Und noch ein Nachtrag: weil du ja in der Liste Zeiger hast, und
*it einen Zeiger liefert, musst du natürlich ausgeben mit:
1
    std::cout << (**it);
#1309782
Lesenswert?

printDichSelbst() ist doch eine Methode der Klasse, und die gibt
die Elemente auf den Stream aus, der ihr übergeben wird.
Wieso sollte printDichSelbst friend sein, als Methode einer Klasse
kann sie doch auf alles zugreifen?

Als friend muß man nur ggf. den globalen Operator << deklarieren,
wenn printDichSelbst() nicht public ist.

Die Implementierung von printDichSelbst() ist natürlich deine
Sache, ich weiß doch nicht was du in der Basisklasse und in den
abgeleiteten hast und wie du das ausgegeben haben willst.
Die Glaskugeln sind heute schon ziemlich beansprucht.
#1310043
Lesenswert?

Frank schrieb:
> was versteht ihr da nicht?

Jetzt scheinst du ja wieder nüchtern zu sein :-)

> ich bekomm jetzt die Adressen vom Iterator geliefert und je nachdem
> welche adresse
> er ausgibt springt er in die klassen von wem die adresse stammt und gibt
> das
> in der jeweiligen klasse (überladen aus)

soweit klar.

> ist aber nicht so schon da ich ja dann in jeder klasse irgent eine
> funktion brauche die die daten dann per cout ausgibt

Ja. Genau so macht man das.
Wer ausser der Klasse selbst, soll den wissen, welche Daten es in der 
Klasse gibt?


> so meine Idee
> eine zentralle globale funktion die überall als friend deklariert ist
> und die dann die daten ausgibt

Wenn du mal genauer darüber nachdenkst, ist das nicht so toll. Gesetz 
den Fall, das würde tatsächlich gehen. Woher soll denn diese globale 
Funktion wissen, welche Membervariablen es gibt, wie sie formatiert 
werden sollen bzw. ob spezielle Zusätze wie Labels oder dlg. notwendig 
sind. Was ist mit Membervariablen, die selbst wieder Objekte sind? 
Sollen die auch mit ausgegeben werden oder Statusvariablen, die 
ausserhalb der Klasse niemand zu wissen braucht.

All das kann nur die Klasse selbst wissen. Und daher muss die 
Ausgabefunktion in die Klasse wandern.
Gast #1310288
Lesenswert?

>> Sorry. Bin noch Anfänger :-)
>
> Glaub' ich nicht.

Ein echter Profi weiß, daß er noch keiner ist. (oder so)

@Karl Heinz:

> Wie ist eigentlich der Status von Reflection und C++

Um das Thema ist es recht ruhig geworden. C++ 0x steht ja vor der Tür, 
aber meines Wissens wird's das da nicht geben. Auch unter 
http://en.wikipedia.org/wiki/C++0x (übrigens interessant zu lesen) 
findet man nichts davon.

@usu:

Solche Leute wie dich, die nichts zum Thema beitragen und gleichzeitig 
einen der hilfsbereitesten und kompetentesten Regulars im Forum als 
"blöddaherredner" bezeichnen, sind mir die liebsten...
#1310314
Lesenswert?

Rolf Magnus schrieb:

> Um das Thema ist es recht ruhig geworden. C++ 0x steht ja vor der Tür,
> aber meines Wissens wird's das da nicht geben. Auch unter
> http://en.wikipedia.org/wiki/C++0x (übrigens interessant zu lesen)
> findet man nichts davon.

Ist wirklich interessant!
Hab zu lesen angefangen, aber das will alles wohl durchdacht werden. 
Wird eine Bettlektüre :-)
#1310330
Lesenswert?

Ich bin ja verblüfft, dass man anhand einer so schlechten Beschreibung 
(kaum Code, Ausdrucksweise unverständlich, Rechtschreibung katastrophal) 
eine so gute Problemlösung hinbekommt. Wenn ich Arbeitgeber wäre, würde 
ich jemanden der das fertig bringt sofort einstellen :-)
Dem Themenersteller freilich würde ich eine Abmahnung zukommen lassen 
;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren