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 ]
020
15.11.2016, 11:22 Uhr
Joe1903




Zitat von ao:
Mach als Member von X ein std::string-Objekt, schreib den Text da rein und hol dir über c_str() den char-Pointer darauf. Den gibste dann zurück. Nicht schön und voller Fallstricke, über die man später richtig hart auf die Nase fliegen kann, aber fertig.


Kannst du mir bitte ein letzes Mal ein Codebeispiel geben?Ich werde es nicht benutzen versprochen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
15.11.2016, 11:30 Uhr
ao

(Operator)


Mach es einfach so wie in Beitrag 10.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
15.11.2016, 11:37 Uhr
Joe1903




Zitat von ao:
Mach es einfach so wie in Beitrag 10.


Aber da fehlt ja das const.Das ist elementar anscheinend.Es MUSS der Aufgabenstellung genau entsprechen aber eben ohne dynamischen Ausgabepuffer.
Ich versteh sowieso nicht,warum das schlecht geeignet ist zum Tracen..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
15.11.2016, 11:42 Uhr
ao

(Operator)



C++:
#include <stdio.h>

char buffer[1024];

class X
{
    int n;                //    irgendein Member
    
public:

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



Wenn die Aufgabe erledigt ist, dann tu mir bitte den Gefallen und poste oder verlinke die Musterlösung. Und noch ne neugierige Frage: Wer stellt solche Aufgaben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
15.11.2016, 12:14 Uhr
ao

(Operator)



Zitat von Joe1903:
Ich versteh sowieso nicht,warum das schlecht geeignet ist zum Tracen..


Das sieht man eigentlich schon an deinem Anwendungsbeispiel, warum das schlecht geeignet ist:

C++:
X x;
const char*dataAsString = x;
printf("x=%s\n",dataAsString); )


Hier wird eigens ein char-Pointer deklariert und zugewiesen um den Aufruf des Operators zu erzwingen. Will man hier mehrere Objekte tracen, muss man das für jedes einzelne Objekt machen - das gibt eine Orgie von Pointern.

Und, wenn man zu einem späteren Zeitpunkt dieselben Objekte nochmal tracen will (um Veränderungen zu erkennen), muss man alle Pointer neu zuweisen, weil nur das für die erneute Ausführung des Operators sorgt. Es ist dreckig, hinter einer Zuweisung die Ausführung einer Funktion zu verstecken.

Hätte man dagegen folgende Methode:

C++:
std::string X::toString () const;

dann könnte man einfach diesen Einzeiler schreiben:

C++:
std::cerr << .... << x.toString() << .... << std::endl;


Das könnte man wiederholen, so oft man will, hätte keinen Ärger mit dem Speicher, es wäre so einfach.

Eine andere Möglichkeit ist, den globalen Operator << zu überladen, so dass er X-Objekte streamen kann. Dann kann man direkt std::cerr << x; schreiben, ohne .toString(). Das sollte man euch zur Aufgabe geben, wenn ihr schon Operatoren überladen sollt.

Dieser Post wurde am 15.11.2016 um 12:20 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
15.11.2016, 12:31 Uhr
Joe1903




Zitat von ao:

C++:
#include <stdio.h>

char buffer[1024];

class X
{
    int n;                //    irgendein Member
    
public:

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



Wenn die Aufgabe erledigt ist, dann tu mir bitte den Gefallen und poste oder verlinke die Musterlösung. Und noch ne neugierige Frage: Wer stellt solche Aufgaben?


Eine Frage:Wenn die Eingabe mehr ist als der Buffer,was passiert dann?
Muss man das "abfangen"?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
15.11.2016, 12:48 Uhr
ao

(Operator)


Ja, das muss man abfangen, weil es sonst knallt. Das schaffst du aber alleine.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
15.11.2016, 14:41 Uhr
Joe1903




Zitat von ao:
Ja, das muss man abfangen, weil es sonst knallt. Das schaffst du aber alleine.


Der Typ hat mich so verunsichert,ich könnte nicht mal ein Hello world schreiben.
Könnte ich es bitte mal sehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
15.11.2016, 14:47 Uhr
ao

(Operator)


Mit snprintf statt sprintf.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
16.11.2016, 12:43 Uhr
Joe1903



Was ist hier falsch?


C++:
#include <stdio.h>

class X;
{
   char buffer[1024];

   int n;
   int cx;

public:
   X(int n_) : n(n_) {}
   operator char * () const;
};

X::operator char * () const
{
   cx = snprintf(buffer,sizeOf(buffer),"%d",n);
   return buffer;
}

int main()
{
   X x(5);
   const char*dataAsString = x;
   if (cx >=0)
   {
      printf("x=%s\n",dataAsString);
   }
   else
   {
      printf("Value too long");
   }
   return 0;
}

 
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: