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
Formulier deine Frage bitte neu. Es ist absoolut nicht erkennbar, was du eigentlich willst. (Hinweis: 'this' macht nur in einer Memberfunktion einer Klasse Sinn)
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
Hallo es geht nicht so wie ich will die Fehlermeldung von Visual suggeriert einen das es doch gehen könnte abes das geht nicht
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?
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.
Also auf gut deutsch kann man aus einer Klasse heraus eine globale OPeratorfunktion bei Stream Klassen aufrufen?
> 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.
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)
Bei deiner Frage kann ich leider nicht helfen. Aber du kannst deine ganzen this mir geben, ich verbrauche mehrere am Tag.
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
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.
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); |
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
bei friend kann ich die elemente doch direkt aufrufen oder
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.
@ Karl heinz Buchegger bist du Programmiere oder bist ein blöddaherredner
@frank: Ich weiß nicht genau, was die in C++ fehlt, aber in Deutsch fehlen dir ganz extrem die Satzzeichen!!!
usu schrieb: > @ Karl heinz Buchegger > > bist du Programmiere oder bist ein blöddaherredner Sorry. Bin noch Anfänger :-)
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.
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.
>> 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...
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.
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 :-)
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.