Konvertierung von 'class CString *' in 'const char *'



  • Hallo!

    Ich hab bei folgendem Programm Probleme bei der Konvertierung folgendes Problem:

    error C2664: 'MessageBoxA' : Konvertierung des Parameters 1 von 'class CString *' in 'const char *' nicht moeglich

    CString test;
    class A
    {
    test = testIter->name;
    MessageBox(test); // funktioniert
    }
    _______________________
    
    class B
    {
    CKlasseA *p_klasseA;
    p_klasseA = new CKlasseA();
    
    MessageBox(&p_klasseA->test);
    }
    

    Ich habe nun beispielsweise versucht mit

    MessageBox((const char *)&p_klasseA->test)
    und
    MessageBox((LPCTSTR)&p_klasseA->test)
    

    diese Konvertierung vorzunehmen. Ein Fehler wird zwar nicht mehr angezeigt, aber die Ausgabe liefert ein Wirrwar an Buchstaben wie beispielsweise "IEI_1/4°A".
    Über die Suche bin ich leider auch nicht schlauer geworden.
    Ich hoffe, dass ich den interessanten Codeausschnitt relativ einfach dargestellt habe und nichts vergessen habe.

    Grüße Edmundy



  • edmundy schrieb:

    Ich habe nun beispielsweise versucht mit

    MessageBox((const char *)&p_klasseA->test)
    und
    MessageBox((LPCTSTR)&p_klasseA->test)
    

    diese Konvertierung vorzunehmen. Ein Fehler wird zwar nicht mehr angezeigt,

    Natürlich beschwert sich der Compiler dann nicht mehr. Mit einem Cast sagst du dem Compiler, dass du es besser weißt als er. Also hält er den Mund.

    Ein Cast ist in den meisten Fällen nicht geeignet, um Compilefehler zu beheben. Damit tauschst du den Compilefehler nur gegen einen Laufzeitfehler aus, und die sind noch schwieriger zu beheben.

    Lass einfach das & weg. Im ersten Fall hast du doch auch keins.



  • edmundy schrieb:

    class B
    {
    CKlasseA *p_klasseA;
    p_klasseA = new CKlasseA();
    
    MessageBox(&p_klasseA->test);
    }
    

    Da ist ganz einfach ein & zu viel (bei der Gelegenheit solltest du die Fehlermeldungen mal genauer ansehen - insbesondere die Verteilung der *).



  • Hallo,

    Danke für die Erläuterungen mit dem &. Mein Problem war zuerst, dass ich einen leeren Zeiger hatte und daher versuchte ich es mit dem &, was zu dem geschilderten Problem führte.
    Ich hab den interessanten Codeausschnitt jetzt mal erweitert, da ich denke, dass es doch eher ein grundlegender Fehler ist.

    // KlasseA.h
    
    class CKlasseA : public CDialog
    {
        CString test;
        CKlasseB m_klasseb;
        void Create_1();
    };
    
    //KlasseA.cpp
    
    void CKlasseA::Create_1()
    {
        test = testIter->name;
        MessageBox(test); // funktioniert
    }
    _______________________
    
    // KLasseB.h
    
    class CKlasseA;
    class CKlasseB : public CDialog
    {
        public: CKlasseA *p_klasseA;
        void Create_2();
    };
    
    // KlasseB.cpp
    
    #include "KlasseA.h"
    
    void CKlasseB::Create_2()
    {
        p_klasseA = new CKlasseA();
        MessageBox(p_klasseA->test); // eine leere Anzeige
    }
    }
    

    Ich hoffe, dass ich den Zusammenhang gut dargestellt habe und den Bereich des Boards nicht vollkommen verlassen zu haben.

    Gruß Edmundy



  • Und du wunderst dich jetzt darüber, dass da eine leere Messagebox angezeigt wird?

    p_klasseA->test wird nirgendwo zugewiesen, also ist der String natürlich immer noch leer.



  • Außerdem hat CKlasseA einen Member vom Typ CKlasseA - wenn das kein Tipfehler ist, wundert es mich, wie der Code durch den Compiler gekommen ist (rekursive Datentypen gibt's in C++ nicht).



  • CStoll schrieb:

    Außerdem hat CKlasseA einen Member vom Typ CKlasseA - wenn das kein Tipfehler ist, wundert es mich, wie der Code durch den Compiler gekommen ist (rekursive Datentypen gibt's in C++ nicht).

    Sorry, ich habe mich dort leider verschrieben gehabt und es trotz Korrekturlesen übersehen gehabt.

    Ich hab dank MFK den Fehler nun gefunden, bin dann auf die eigentliche Lösung gekommen und hab sehr viel über diese Problematik gelernt. Vielen Dank an euch beide.

    Gruß Edmundy


Anmelden zum Antworten