Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe mit cast operator

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 < [ 5 ] [ 6 ]
030
16.11.2016, 14:14 Uhr
ao

(Operator)


Einiges. Zuerst mal muss in Zeile 3 hinter class X das Semikolon weg. Wenn du das gemacht hast,werden die Fehlermeldungen aussagekräftiger.

Als nächstes überleg dir nochmal, was das "const" am Ende einer Klassenmethode für die Member der Klasse bedeutet und was du innerhalb von operator char *() mit cx und buffer machst.

Der Test von cx auf >= 0 in main ist Blödsinn. Ich verstehe, was das soll, aber so kann man das nicht machen. Selbst wenn es syntaktisch richtig wäre, es ist semantisch (d.h. im Bedeutungskontext) falsch. Man kann nicht ein Objekt in ein anderes umwandeln und den Erfolg dieser Aktion im Quellobjekt speichern und den Anwender zwingen, das vor der Verwendung des Ergebnisses nochmal abzufragen. Das ist so umständlich, dass es die Entscheidung, eine Operator-Form zu wählen, ad absurdum führt.

Operatoren sind dann brauchbar, wenn sie sicher ein Ergebnis liefern können, das man blind verwenden kann, Beispiel: Addition. Wenn bei der Operation was schiefgehen kann, wird es umständlich. Der Operator kann dann den Fehler entweder im Ergebnis anzeigen (z.B. indem er "value too long" reinschreibt) oder er kann eine Exception werfen.

Wenn das alles nicht geht, dann ist der Operator nicht das Mittel der Wahl, dann macht man besser eine Funktion, die einen Fehlercode retourniert und das eigentliche Ergebnis über pass-by-reference rein- und rausreicht. Aber die Option hast du hier nicht. Für das, was hier gefragt ist (Trace-Operator) würde ich einfach "value too long" oder irgendwas ähnliches in den Puffer schreiben, wenn snprintf anzeigt, dass der Platz nicht gereicht hat.

Lies nochmal in der Doku zu snprintf nach, wie die Funktion das genau anzeigt. Deine Auswertung ist nicht richtig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
16.11.2016, 14:24 Uhr
Joe1903




Zitat von ao:
Einiges. Zuerst mal muss in Zeile 3 hinter class X das Semikolon weg. Wenn du das gemacht hast,werden die Fehlermeldungen aussagekräftiger.

Als nächstes überleg dir nochmal, was das "const" am Ende einer Klassenmethode für die Member der Klasse bedeutet und was du innerhalb von operator char *() mit cx und buffer machst.

Der Test von cx auf >= 0 in main ist Blödsinn. Ich verstehe, was das soll, aber so kann man das nicht machen. Selbst wenn es syntaktisch richtig wäre, es ist semantisch (d.h. im Bedeutungskontext) falsch. Man kann nicht ein Objekt in ein anderes umwandeln und den Erfolg dieser Aktion im Quellobjekt speichern und den Anwender zwingen, das vor der Verwendung des Ergebnisses nochmal abzufragen. Das ist so umständlich, dass es die Entscheidung, eine Operator-Form zu wählen, ad absurdum führt.

Operatoren sind dann brauchbar, wenn sie sicher ein Ergebnis liefern können, das man blind verwenden kann, Beispiel: Addition. Wenn bei der Operation was schiefgehen kann, wird es umständlich. Der Operator kann dann den Fehler entweder im Ergebnis anzeigen (z.B. indem er "value too long" reinschreibt) oder er kann eine Exception werfen.

Wenn das alles nicht geht, dann ist der Operator nicht das Mittel der Wahl, dann macht man besser eine Funktion, die einen Fehlercode retourniert und das eigentliche Ergebnis über pass-by-reference rein- und rausreicht. Aber die Option hast du hier nicht. Für das, was hier gefragt ist (Trace-Operator) würde ich einfach "value too long" oder irgendwas ähnliches in den Puffer schreiben, wenn snprintf anzeigt, dass der Platz nicht gereicht hat.

Lies nochmal in der Doku zu snprintf nach, wie die Funktion das genau anzeigt. Deine Auswertung ist nicht richtig.


Kannst du mir bitte ein Code Snippet aufzeigen?Ich bin kein C++-ler und lerne am Besten wenn ich etwas sehe.Dann schreib ich es um und poste es hier rein (mit einem anderen Data member z.B.)
Mir gehts wirklich nicht um outsourcen oder dergleichen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
16.11.2016, 14:50 Uhr
ao

(Operator)



Zitat von Joe1903:
... lerne am Besten wenn ich etwas sehe.

Das bezweifle ich, ehrlich gesagt. Ich habe mehrere Schnipsel gepostet in diesem Thread, mit Erklärungen dazu, aber du hast daraus nicht allzuviel gelernt, das zeigen die Fehler, die du gemacht hast. Dir fehlt die praktische Übung. Du solltest dich hinsetzen und Programme schreiben, nur so lernt man programmieren.

Du kannst gerne Fragen stellen, dann bemühe ich mich, verständlich zu antworten. Aber einfach nur Lösungen liefern tue ich nicht mehr.

Dieser Post wurde am 16.11.2016 um 14:52 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
033
16.11.2016, 14:56 Uhr
Joe1903




Zitat von ao:
[quote Joe1903]... lerne am Besten wenn ich etwas sehe.

Das bezweifle ich, ehrlich gesagt. Ich habe mehrere Schnipsel gepostet in diesem Thread, mit Erklärungen dazu, aber du hast daraus nicht allzuviel gelernt, das zeigen die Fehler, die du gemacht hast. Dir fehlt die praktische Übung. Du solltest dich hinsetzen und Programme schreiben, nur so lernt man programmieren.

Du kannst gerne Fragen stellen, dann bemühe ich mich, verständlich zu antworten. Aber einfach nur Lösungen liefern tue ich nicht mehr.[/quote]

Ok,danke.Ich arbeite bissle dran und poste wenn ich etwas habe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
034
16.11.2016, 15:43 Uhr
Joe1903




Zitat von ao:
[quote Joe1903]... lerne am Besten wenn ich etwas sehe.

Das bezweifle ich, ehrlich gesagt. Ich habe mehrere Schnipsel gepostet in diesem Thread, mit Erklärungen dazu, aber du hast daraus nicht allzuviel gelernt, das zeigen die Fehler, die du gemacht hast. Dir fehlt die praktische Übung. Du solltest dich hinsetzen und Programme schreiben, nur so lernt man programmieren.

Du kannst gerne Fragen stellen, dann bemühe ich mich, verständlich zu antworten. Aber einfach nur Lösungen liefern tue ich nicht mehr.[/quote]

Ich hab jetzt das hier gemacht:


C++:
#include <stdio.h>

char buffer [10];

class X
{
   int n;
  
   public:

   X (int n_) : (n_) {}
   operator char * () const
   {
      snprintf(buffer,sizeof(buffer,"%d",n);
      return buffer;
   }
};

int main()
{
   X x(12345);

   const char*dataAsString = x;
   printf("x=%s\n", dataAsString);
   return 0;
}


Dieser Post wurde am 16.11.2016 um 15:43 Uhr von Joe1903 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
035
16.11.2016, 16:49 Uhr
ao

(Operator)


OK, jetzt noch ein paar Tippfehler beseitigen, und dann kompiliert das sogar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
036
16.11.2016, 16:57 Uhr
Joe1903




Zitat von ao:
OK, jetzt noch ein paar Tippfehler beseitigen, und dann kompiliert das sogar


Oh super,es hat kompiliert..Danke danke.Nur noch zwei Fragen:
Siehst du irgendwo einen Fehler?
An welcher Stelle kann ich am besten die Fehlermeldung einbauen?

Danke nochmal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
037
16.11.2016, 17:27 Uhr
ao

(Operator)


Denk selber nach. An welcher Stelle erfährst du es, wenn der Platz nicht gereicht hat?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
038
16.11.2016, 19:09 Uhr
Joe1903




Zitat von ao:
Denk selber nach. An welcher Stelle erfährst du es, wenn der Platz nicht gereicht hat?

Nach snprintf weiss ich das ja.Aber worauf kann ich die Abfrage machen?Direkt auf snprintf geht ja nicht und Buffer auch nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
039
16.11.2016, 21:53 Uhr
ao

(Operator)


Auf das, was snprintf zurückgibt. Lies in der Doku nach, was das ist. Das ist da genau beschrieben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 < [ 5 ] [ 6 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: