Warum geht das nicht?



  • CString(&chBuffer);

    das erstellt ein temporäres objekt vom type CString

    den konstruktor kannst du nur in der initialisierungsliste aufrufen...
    aber du suchst uU ein
    CString::CString(int i)
    : basic_string<char>(Int2Str(i))
    {
    }
    wobei Int2Str eine private static methode von CString ist (oder eine globale funktion)

    übrigens, CString ist als Name nicht gut gewählt, die MFC besitzt bereits ein CString.



  • das heisst nichts anderes als das cstring keinen konstruktor für const char* (oder char*) hat

    ich bin mir jetzt nicht sicher ob man das so machen kann:

    CString::CString(int nNumber)
    {
        char chBuffer[16];
        sprintf(chBuffer, "%i", nNumber);
        string(&chBuffer);  //geht das?
    }
    

    oder ansonsten könnte man einfach noch sonen konstruktor reinschreiben:

    CString::CString(const char* str) : string(str)
    { }
    

    ich nehme an es gibt da irgendwas besseres aber naja 🙂



  • Danke, Shade of Mines' Lösung geht! 🙂

    übrigens, CString ist als Name nicht gut gewählt, die MFC besitzt bereits ein CString.

    Mein CString ist auch in einem Namespace 🙂

    Man leitet doch nicht von std::string ab

    So und warum bitteschön net?

    ChrisM



  • Original erstellt von ChrisM:
    So und warum bitteschön net?

    es ist gefährlich von std::string abzuleiten, aber vertretbar.

    std::string hat keinen virtuellen Destruktor, dh dass der CString Destruktor nicht aufgerufen wird, wenn ein CString Objekt als Zeiger auf string deletet wird.

    wenn man das aber bedenkt (also CString nicht polymorph verwenden) dann spricht nix dagegen.

    Auch wenn CString in einem namespace liegt, ist der Name trotzdem ungünstig.
    denn wenn ich CString sehe (zB weil irgendwo anders using deinNS::CString; steht) dann denke ich an MFC und erwarte ganz anderes Verhalten von CString.



  • Mal ne Frage, was hindert mich daran, das Template zu verändern wie ich will?
    Ja, ich weiß, ich sollte an den Headern nix verändern, aber so ein kleiner Engriff kann doch net schaden, oder?

    ChrisM



  • 😮 😮 🙄



  • Original erstellt von ChrisM:
    Mal ne Frage, was hindert mich daran, das Template zu verändern wie ich will?
    Ja, ich weiß, ich sollte an den Headern nix verändern, aber so ein kleiner Engriff kann doch net schaden, oder?

    jo genau und wenn jemand anders mal dein programm kompilieren will muss er sich extra noch deine frisierte stdandardbibliothek besorgen. und da deine nicht header anders heissen muss er noch extra zum kompilieren des einen programms den inluce path änder.... ausserdem kann die stdlib kompilerspezifisches zeug enthalten blah blah blah...

    [ Dieser Beitrag wurde am 20.04.2003 um 14:41 Uhr von japro editiert. ]



  • OK, überzeugt, der Header bleibt wie er ist 😃

    ChrisM



  • So, die Probleme gehen schon los:
    Ich hab eine Funktion, die eine Exception wirft. Wenn ich als Parameter an diese Funktion nichts übergebe (als Parameter = void) klappt alles, übergebe ich aber ein const CString&, krieg ich nur "Debug Assertion failed! ... Expression: _CrtIsValidHeapPointer(pUserData)", wenn ich auf ignorieren drücke, dann noch eine andere Debug Assertion, dann wird die Exception behandelt und am Schluss noch eine Schutzverletzung. 😞

    Könnte das evtl. doch was mit dem Destruktor zu tun haben? (meine hat ja keine Member und folglich auch keinen Destruktor, ich verlass mich einfach auf den von std::string)

    ChrisM



  • minimalcode posten



  • So, wenn ich die Laufzeitbibliothek bei meiner DLL, die die Funktion hat, die die Exception wirft, und bei meiner EXE, die diese aufruft, auf Multithreaded DLL Debuggen stelle, gehts, aber ich will bei diesem Projekt keine geshared Laufzeitbibliothek!
    Kann das evtl. daran liegen, dass meine EXE den String erzeugt und die DLL ihn dann deleted (d.h. es versucht, weil er ja auf dem Heap der EXE liegt)? Aber eigentlich darf die DLL sowas doch auch bei einer Exception nicht versuchen, wenn nur eine konstante Referenz übergeben wird? Von Parametern aufrufen war bei Wurf einer Exception nirgends die Rede 😞

    ChrisM



  • Minimalcode, ok:

    // DLL - wenn ich den strName Parameter auskommentiere, gehts!
    class CScriptLanguageMgr
    {
    public:
        AGEAPI IScriptLanguage &GetScriptLanguage(const CString &strName) const;
    };
    
    void CScriptLanguageMgr::UnregisterScriptLanguage(const CString &strName)
    {
        /*// Remove specified instance of IScriptLanguage from the map
        ScriptLanguageMap::iterator i = m_ScriptLanguageMap.find(strName);
        if (i != m_ScriptLanguageMap.end())
            m_ScriptLanguageMap.erase(i);
        else*/
            //AGEERROR(CScriptLanguageNotFoundException, "Script language '" + strName + "' not found!");
            //throw CScriptLanguageNotFoundException("test", __FILE__, __LINE__);
        throw 1;
    }
    
    // EXE
    
    (pKernel->GetScriptLanguageMgr()).UnregisterScriptLanguage("a");
    

    ChrisM



  • So, sogar wenn ich statt CString std::string einsetze, tritt der Fehler auf!

    ChrisM



  • Ist das überhaupt gültig?

    (pKernel->GetScriptLanguageMgr()).



  • Ja, 100%. Und selbst wenn es nicht gültig wäre, würde es ja nichts machen, weil ich in der Funktion ja nicht auf this zugreife (siehe Quellcode oben). 🙂

    ChrisM



  • *push*

    ChrisM


Anmelden zum Antworten