2016-09-30 3 views
-4

Hallo ich habe Probleme mit const char * auf seltsame Weise die gleiche. Color :: Text() gibt ein statisches Char-Array zurück, aber es wird auch verwendet, um den Zeiger const char * für das Array zu initialisieren.Const char * seltsames Verhalten

wtf mache ich, wenn ich Rofl :: Standard, um tatsächlich zu arbeiten und nicht die neueste "const char" es Farbe :: Text produziert?

#include <windows.h> 
class Color 
{ 
public: 
    int R; 
    int G; 
    int B; 
    int A; 
    Color(int r, int b, int g, int a = 255) 
    { 
    R = r; 
    G = g; 
    B = b; 
    A = a; 
    } 
    const char* Text() 
    { 
    static char Texts[124]; 
    snprintf(Texts, 124, "%i %i %i %i", R, G, B, A); 
    return Texts; 
    } 
} 
class rofl 
{ 
public: 
    const char* Default; 
    const char* Value; 
    rofl(const char* d) 
    { 
     Default = d; 
     Value = d; 
    } 
} 

rofl dood("0"); 
rofl doaaod(Color(0,0,0).Text()); 
rofl xxxx(Color(0,55,0).Text()); 

int main() 
{ 
    printf("%s %s\n", dood.Default, dood.Value); 
    printf("%s %s\n", doaaod.Default, doaaod.Value); 
    printf("%s %s\n", xxxx.Default, xxxx.Value); 
    return 0; 
} 

der Ausgang ist:

0 0 
0 55 0 0 0 0 
0 55 0 0 55 0 
+0

Erstellen Sie im Konstruktor von 'rofl' einen Puffer (z. B. mit dem Operator' new') für 'Default' und' Value', auf den verwiesen wird. Kopieren Sie dann Daten in diese Puffer. Besser noch, verwenden Sie 'std :: string' Objekte anstelle von' char * ', und die dynamische Zuweisung wird sauber für Sie verwaltet. – Peter

Antwort

1

Sie haben nur einen Zeichenpuffer in Ihrem Code (abgesehen von den Zeichenketten). A const char* ist ein Zeiger auf einen Zeichenpuffer, nicht ein neuer Puffer, der eine Kopie des Originals ist.

So ist es natürlich, dass jedes Mal, wenn Sie Color :: Text aufrufen, Sie über den gleichen Zeichenpuffer schreiben und alle Zeiger darauf dasselbe lesen.

Sie müssen den Begriff der Zeiger in C und C++ verstehen. In diesem Fall sollten Sie in C++ und für das von Ihnen benötigte Verhalten alle Verwendungen von const char* durch std::string ersetzen.

Ich empfehle Ihnen das Buch "Accelerated C++", um C++ leicht zu lernen, ohne auf die Details einzugehen, die in der Sprache ein bisschen archaisch sind.

+0

Ich kann Müll wie std :: string – Lolmelon

+1

@Lolmelon nicht verwenden: Ihre Frage ist markiert [Tag: C++]. Wenn Sie C++ nicht verwenden können, markieren Sie es nicht als solches. – IInspectable

+0

@Lolmelon: "Müll"? –

Verwandte Themen