deprecated conversion from string constant to 'char*'



  • #include <iostream>
    
    class MyClass
    {
            public:
                    MyClass() : message("") {}
    
                    virtual ~MyClass() {};
    
                    char* get_message() { return message; }
    
            private:
                    char* message;
    };
    
    int main(int argc, char** argv)
    {
            MyClass mc;
    
            std::cout << mc.get_message() << std::endl;
    }
    

    Seit g++ 4.2.1 bekomme ich folgende warning "deprecated conversion from string constant to 'char*' (Zeile 6)". Wie initialisiere ich message in der Kalsse, ohne die Warnung zu bekommen???

    Grüße, K.



  • String-Literale sind zwar offiziell konvertierbar zu 'char*', aber technisch sind sie 'const char*'. Wenn du nicht vorhast, schreibend auf die Message zuzugreifen, kannst du sie definieren als 'const char*', andernfalls solltest du lieber mit std::string arbeiten.



  • Ohh das habsch noch nie gemocht ... wenn da einer hingeht und einem Zeiger einfach ne Zeichenfolge zuweist ... naja

    class string_functor
    {
        char* m_data;
    
    public:
        string_functor(const char* str) 
            : m_data(new char[std::strlen(str) + 1])
        { std::strcpy(m_data, str); }
    
        virtual ~string_functor() 
        { delete [] m_data; }
    
        virtual const char* operator()() const { return m_data; }
    };
    

    🙂 soo ... schön speicher anfordern und reinkopieren ... wie sich das gehört 🙂



  • *brrr* Machs doch gleich richtig. Das ist doch reines gefrickel. Du präsentierst hier echt manchmal "Lösungen", das geht auf keine Kuhhaut.

    #include <iostream>
    #include <string>
    
    class MyClass
    {
        public:
               MyClass() : message("") {}
    
               virtual ~MyClass() {};
    
               const std::string& get_message() const
               { return message; }
    
        private:
               std::string message;
    };
    
    int main(int argc, char** argv)
    {
            MyClass mc;
    
            std::cout << mc.get_message() << std::endl;
    }
    


  • Naja ich sehe nicht unbedingt immer ein, warum man für so kleine Sachen direkt die std::basic_string-Klasse nutzen soll. Und man sollte auch die Grundlagen können.



  • (D)Evil schrieb:

    Naja ich sehe nicht unbedingt immer ein, warum man für so kleine Sachen direkt die std::basic_string-Klasse nutzen soll.

    1.) Kopier doch mal ein string_functor-Objekt. Spätestens wenn das zweite Objekt zerstört wird, hast du die Bescherung :xmas1:
    2.) Versuch die Zeichenkette "item1\0item2\0item3\0\0" in string_functor zu speichern.

    (D)Evil schrieb:

    Und man sollte auch die Grundlagen können.

    Stimmt. Aber viele unterscheiden nicht zwischen "kennen" und "können".



  • Zuerstmal sollte man sich in der Sprache zurechtfinden, und da kommt man irgendwann, nachdem man Kontrollstrukturen, Klassen und die anderen Basics hinter sich hat, auch mal dazu ein Array von Objekten zu verwalten. Und darüber kann man sich dann prima an Zeiger und auch C-Strings herantasten. Ich sehe inzwischen nicht mehr ein, warum man einen Anfänger unbedingt gleich damit belasten muss, dass ein Text ein Array von mit Null abgeschlossenen Zeichen ist, um deren Verwaltung im Speicher man sich gefälligst selbst zu kümmern hat, und deren sprachliche Eigenheiten (Array vs. Zeiger auf Literal usw.) man gleich auch noch immer vor Augen haben muss.



  • Hmm stimmt schon, er war aber nunmal mit c-string dran 😉
    @deha: Hmm mir ist durchaus bewusst, dass ich der Regel der Großen Drei nicht folge geleistet habe. Darum ging es mir in dem Beispiel aber auch nicht, sondern darum, wie er das, wenn er schon mit c-strings arbeitet, Kopieren von Zeichenketten hinbekommt.

    Stimmt. Aber viele unterscheiden nicht zwischen "kennen" und "können".

    Sagen wir mal so. Wer sie kann, der kennt sie auch.


Anmelden zum Antworten