Forum: PC-Programmierung Kann man ne this global über ne operatorfunktion


von Frank (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Formulier deine Frage bitte neu.
Es ist absoolut nicht erkennbar, was du eigentlich willst.

(Hinweis: 'this' macht nur in einer Memberfunktion einer Klasse Sinn)

von Frank (Gast)


Lesenswert?

Hallo
ich habe in einem Container verschiedene Obj. polim. verwaltet

und anstatt die in jeder ihrer Klassen einzeln über Med. zu machen
möchte ich die this Adressen global ausgeben

von Frank (Gast)


Lesenswert?

Hallo es geht nicht so wie ich will
die Fehlermeldung von Visual suggeriert einen das es doch gehen könnte
abes das geht nicht

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank schrieb:
> Hallo
> ich habe in einem Container verschiedene Obj. polim. verwaltet
>
> und anstatt die in jeder ihrer Klassen einzeln über Med. zu machen
> möchte ich die this Adressen global ausgeben

Versteht das irgendjemand?

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly schrieb:
> Frank schrieb:
>> Hallo
>> ich habe in einem Container verschiedene Obj. polim. verwaltet
>>
>> und anstatt die in jeder ihrer Klassen einzeln über Med. zu machen
>> möchte ich die this Adressen global ausgeben
>
> Versteht das irgendjemand?

Nein. Ist nur belangloses Kauderwelsch. Muss man nicht verstehen.

von Frank (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


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.

von Karl H. (kbuchegg)


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)

von Klaus W. (mfgkw)


Lesenswert?

Bei deiner Frage kann ich leider nicht helfen.
Aber du kannst deine ganzen this mir geben, ich verbrauche mehrere am 
Tag.

von Frank (Gast)


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

von Klaus W. (mfgkw)


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.

von Klaus W. (mfgkw)


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);

von Frank (Gast)


Lesenswert?

operator<<( std::ostream &s, const deineBasisklasse &einObjekt );
{
    einObjekt.printDichSelbst( s );
    return s;
}


das hab ich auch soweit

was noch fehlt ist die implementierung ind der virtuellen
Funktion

von Frank (Gast)


Lesenswert?

bei friend kann ich die elemente doch direkt aufrufen oder

von Klaus W. (mfgkw)


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.

von usu (Gast)


Lesenswert?

@  Karl heinz Buchegger

bist du Programmiere oder bist ein blöddaherredner

von Klaus (Gast)


Lesenswert?

@frank: Ich weiß nicht genau, was die in C++ fehlt, aber in Deutsch 
fehlen dir ganz extrem die Satzzeichen!!!

von Karl H. (kbuchegg)


Lesenswert?

usu schrieb:
> @  Karl heinz Buchegger
>
> bist du Programmiere oder bist ein blöddaherredner

Sorry. Bin noch Anfänger :-)

von Karl H. (kbuchegg)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:
> usu schrieb:
>> @  Karl heinz Buchegger
>>
>> bist du Programmiere oder bist ein blöddaherredner
>
> Sorry. Bin noch Anfänger :-)

Glaub' ich nicht.

von Rolf Magnus (Gast)


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...

von (prx) A. K. (prx)


Lesenswert?

Rolf Magnus schrieb:

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

Profi heisst doch eigentlich nur, dass man es professionell also 
beruflich macht. Nicht unbedingt, dass man darin wirklich gut ist.

von Karl H. (kbuchegg)


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 :-)

von Mark B. (markbrandis)


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 
;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Realität sieht aber i.d.R. anders aus. Der Threadersteller wird ins 
Management befördert, der Problemlöser hingegen mit langweiligen 
Routineaufgaben beschäftigt, bevor er aus betrieblichen Gründen 
gekündigt wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.