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