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 ]
010
02.11.2016, 14:05 Uhr
ao

(Operator)


Hier ist ein Ansatz, der ~somebodys Vorschlag entspricht: Der Ausgabepuffer als Klassen-Member:

C++:
#include <stdio.h>

class X
{
    int n;                //    irgendein Member
    char text [16];        //    Ausgabepuffer
    
public:

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

X::operator char * ()
{
    sprintf (text, "%d", n);
    return text;
}

int main ()
{
    X x(5);
    const char*dataAsString = x;
    printf("x=%s\n",dataAsString);
    return 0;
}


Beachte, dass der operator char* hier nicht mehr mit "const" dekoriert ist. Das ist nicht möglich, weil innerhalb des Operators ein Klassenmember verändert wird, nämlich das text. Das soll laut deiner Aufgabenstellung nicht sein.

Richtig funktionieren tut das aber, weil die Rückgabe "return text;" diesmal ein Objekt retourniert, das auch nach Verlassen der Operatorfunktion noch lebt.

Ein weiteres Problem entsteht, wenn man die Klasse multi-threaded verwendet: Hat man ein Programm, das in mehreren konkurrierenden Threads, also quasi-gleichzeitig sowas wie "const char * dataAsString = x;" macht, und zwar auf demselben x, dann wird man es erleben, dass das Array text, das ja nur einmal existiert, von mehreren Seiten zugleich beschrieben wird. Die Ergebnisse können extrem lustig sein.

Weiter im nächsten Beitrag.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
02.11.2016, 14:12 Uhr
ao

(Operator)


Ein weiterer Ansatz:

C++:
#include <stdio.h>

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

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

X::operator char * () const
{
    char * text = new char[16];    //    dynamisch erzeugter Ausgabepuffer
    sprintf (text, "%d", n);
    return text;
}

int main ()
{
    X x(5);
    const char*dataAsString = x;
    printf("x=%s\n",dataAsString);
    delete[] dataAsString;        //    <--- nicht vergessen: aufräumen!
    return 0;
}


Der Ausgabepuffer wird in der Operatorfunktion angelegt, und zwar dynamisch. Das verändert nicht das X-Objekt, weshalb der Operator hier wieder "const" sein kann.

Wichtig ist, dass dieses Verhalten (dynamische Allokierung) dokumentiert wird, damit der Aufrufer (hier die main-Funktion) den Speicher abräumen kann, wenn er mit der Verarbeitung fertig ist. Wird das vergessen, entsteht ein Speicherleck.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
02.11.2016, 14:37 Uhr
Joe1903



Wo wird der C Style String gespeichert?Welche Restriktionen ergeben sich als Folge?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
02.11.2016, 14:41 Uhr
ao

(Operator)


Das steht da eigentlich schon. Denk mal drüber nach, und wenn du nicht weiterkommst, dann stell noch mal genauere Fragen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
05.11.2016, 08:20 Uhr
Joe1903




Zitat von ao:
Das steht da eigentlich schon. Denk mal drüber nach, und wenn du nicht weiterkommst, dann stell noch mal genauere Fragen.


Ja stimmt.Es wird im char-Array gespeichert und darf max. 16-1 gross sein.Du machst es aber mit dynamischer Memoryzuweisung für das Ergebnis.Wie müsste man es machen,wenn man es nicht dynamisch löst und somit nicht das Memory am Ende wieder freigeben muss?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
07.11.2016, 17:44 Uhr
ao

(Operator)



Zitat von Joe1903:
Wie müsste man es machen,wenn man es nicht dynamisch löst und somit nicht das Memory am Ende wieder freigeben muss?

Dann müsste man ein Objekt verwenden, das den Speicher als Member enthält und selbst verwaltet. Dieses Objekt müsste entweder Rückgabewert der Umwandlungs-Funktion sein (1) oder als Member in X liegen (2).

(1): Das funktioniert syntaktisch nicht, wenn ausdrücklich verlangt ist, das die Umwandlungsfunktion ein char*-Operator sein muss. Diese Forderung kann in C++ aber als antiquiert gelten wie alles, was direkt auf C-Style-Strings operiert.

Man sollte stattdessen sowas wie das hier machen, so wie in jeder modernen OO-Sprache üblich:
std::string X::toString () const;

Das leistet genau dasselbe und gibt ein selbstverwaltetes String-Objekt zurück, das im Speichermanagement keine Zicken macht. Der "operator char*()" ist nur syntaktischer Zucker, der einem aber die Suppe ordentlich versalzen kann (bildlich gesprochen). Das meinte ich mit "üble Kacke".

(2): Dieser Ansatz ist oben an 2. Stelle demonstriert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
14.11.2016, 10:37 Uhr
Joe1903




Zitat von ao:
[quote Joe1903]Wie müsste man es machen,wenn man es nicht dynamisch löst und somit nicht das Memory am Ende wieder freigeben muss?

Dann müsste man ein Objekt verwenden, das den Speicher als Member enthält und selbst verwaltet. Dieses Objekt müsste entweder Rückgabewert der Umwandlungs-Funktion sein (1) oder als Member in X liegen (2).

(1): Das funktioniert syntaktisch nicht, wenn ausdrücklich verlangt ist, das die Umwandlungsfunktion ein char*-Operator sein muss. Diese Forderung kann in C++ aber als antiquiert gelten wie alles, was direkt auf C-Style-Strings operiert.

Man sollte stattdessen sowas wie das hier machen, so wie in jeder modernen OO-Sprache üblich:
std::string X::toString () const;

Das leistet genau dasselbe und gibt ein selbstverwaltetes String-Objekt zurück, das im Speichermanagement keine Zicken macht. Der "operator char*()" ist nur syntaktischer Zucker, der einem aber die Suppe ordentlich versalzen kann (bildlich gesprochen). Das meinte ich mit "üble Kacke".

(2): Dieser Ansatz ist oben an 2. Stelle demonstriert.[/quote]

Hallo nochmal.Ich habe am Wochenende erfolglos versucht eine funktionierende Lösung zu implementieren.
Könnt ihr mir ein Beispiel geben ohne dynmaischen Ausgabepuffer (den man explizit löschen muss) und operator *char const?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
14.11.2016, 13:21 Uhr
ao

(Operator)



C++:
#include <string>
#include <sstream>

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

    X (int n_) : n (n_) {}
    std::string toString () const;
};

std::string X::toString () const
{
    std::stringstream ss;
    ss << n;
    return ss.str();
}

#include <iostream>

int main ()
{
    X x(7);
    std::cout << x.toString () << std::endl;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
15.11.2016, 10:02 Uhr
Joe1903




Zitat von ao:

C++:
#include <string>
#include <sstream>

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

    X (int n_) : n (n_) {}
    std::string toString () const;
};

std::string X::toString () const
{
    std::stringstream ss;
    ss << n;
    return ss.str();
}

#include <iostream>

int main ()
{
    X x(7);
    std::cout << x.toString () << std::endl;
}




Danke für die Antwort.Leider wurde diese Antwort verwiesen,weil es nicht der Aufgabenstellung entspricht (es ist keine toString Methode verlangt).
Ich bin echt am Verzweifeln.Kann mir bitte jemand eine Idee geben,wie ich es laut Aufgabenstellung ohne dynamischen Ausgabepuffer funktioniert?Bitte Freunde..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
15.11.2016, 11:20 Uhr
ao

(Operator)


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