mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wird es doch langsam lesbarer, danke.

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

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:
   std::cout << (*it);
das Ding ausgeben; ggf. wird die überladene Funktion der abgeleiteten
Klasse aufgerufen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei friend kann ich die elemente doch direkt aufrufen oder

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: usu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

bist du Programmiere oder bist ein blöddaherredner

Autor: Klaus (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Sorry. Bin noch Anfänger :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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 
;-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.