Frage zu meiner Config Klasse



  • BorisDieKlinge schrieb:

    statt char array würde ich std:string nehmen

    Wo genau meinst du bitte??
    Ich arbeite die ganze Zeit doch mit string und myString, das einzige mal wo ich char array nehme ist wenn ich das mit c_str() umcaste, damit ichs in den Funktionen verwenden kann???



  • achso ok..;) dann passt das;)



  • 😃 😃 😃 😃 Klingt so wie, einfach mal drauf losgeraten was da falsch sein könnte ohne drüber zu guggen 😃 😃 😃 😃



  • hehe ne.. ich hab beim 2sekunden langen übfliegen ein char Name[200]; endeckt... deswegen hab ich einfach mal den post gemacht;) 😃



  • Blackskyliner schrieb:

    Ich arbeite die ganze Zeit doch mit string und myString, das einzige mal wo ich char array nehme ist wenn ich das mit c_str() umcaste, damit ichs in den Funktionen verwenden kann???

    Erstens kannst du dort die Zwischenspeicherung weglassen und den Rückgabewert von c_str() direkt an fprintf() weitergeben - und zweitens solltest du dort lieber umsteigen auf fstream 😉

    Zur internen Speicherung: Ich würde sogar den vector ganz überspringen und stattdessen eine map<string,pair<myString,MyConfigTypes> > verwenden - damit erleichterst du dir die ganzen Suchvorgänge nach einem bestimmten Config-Eintrag.

    PS: Zu den Forward-Deklarationen: Die bringen einen Nutzwert von 0.0, also kannst du sie auch weglassen 😉

    PPS: Was genau bezweckst du mit dem Config ConfigHandle; ? Entweder der Nutzer kann seine Config-Objekte bei Bedarf definieren, dann braucht er dieses nicht - oder du beschränkst die Nutzung auf genau dieses Objekt, aber dann solltest du ein vernünftiges Singleton aufbauen.



  • Erstens kannst du dort die Zwischenspeicherung weglassen und den Rückgabewert von c_str() direkt an fprintf() weitergeben - und zweitens solltest du dort lieber umsteigen auf fstream

    Okay, ich lese mit die Referenz von fstream mal durch, und ändere dementsprechend.

    Zur internen Speicherung: Ich würde sogar den vector ganz überspringen und stattdessen eine map<string,pair<myString,MyConfigTypes> > verwenden - damit erleichterst du dir die ganzen Suchvorgänge nach einem bestimmten Config-Eintrag.

    Hier fängts an interessant zu werden, weil ich ab hier 0,0% Plan hab wie man sowas machen könnte, ein Schnippet wäre schön *liebgugg*

    Zum PS: Okay ich machse weg 😃

    Zum PPS: Ja, der iss für den Globalen Zugriff auf die Klasse da, hab schon über so ein Singleton-Dingens nachgedacht, werd mir demnächst mal ne TUt darüber anschauen und euch dann warscheinlich mit sinnlosen Anfängerfragen bombadieren :D:D



  • Eine map<> ist eine nette Angelegenheit - letztendlich ein assoziatives Array (d.h. du kannst beliebige Datentypen als Index verwenden). Für deinen Zweck kannst du den Namen als Schlüssel und den zugehörigen Value (und die Read-Only-Marke) als Wert verwenden und kannst sehr schnell einen beliebigen Schlüssel finden:

    struct MyConfigStrucure
    {
      myString Value;
      MyConfgTypes Type
    };
    
    typedef map<string,MyConfigStructure> map_type;
    map_type ConfigArray;
    
    void Config::SetConfigVar(string VarName, string VarValue){
        __Debug("SetConfigVar: Start.\n");
        map_type::iterator pos=ConfigArray.find(VarName);
        if(pos==ConfigArray.end()
        {
            //nicht gefunden
        }
        else if(pos->Type!=READ_ONLY)
            pos->Value = VarValue;
        else
            Debug("Warnung: ConfigValue[%s] ist schreibgeschuetzt.\n\n",VarName.c_str());
    };
    

    (nur mal ein Ausschnitt)



  • Doch so einfach 😮
    Ich danke. 🙂

    Nun mal noch eine Frage zu Singleton Pattern...

    Wenn ich die Dinger hier Privat deklariere,

    private:
        Config() {};
        Config(const Config&);
        Config& operator=(const Config&);
    

    damit daruf von aussen nicht zugrgriffen werden kann, muss ich die dann auch noch irgendwo definieren oder kann ich das gänzlich weg lassen, also das definieren? Weil ich selber benötige die ja auch nicht in meinen Funktionen?? Das einzige was ich Deklarieren sollte ist der Konstruktur, den CopyKonstruktur muss ich, bzw. will ich nicht definieren und im Destruct wird dann einfach nur das Speicherbereich-Reinigen reingetan, die dann beim Zerfall des static Objektes gecalled wird..

    Des weiteren reich es dann auch eine public Method zu implementieren, die einfach ein Statische sobjekt erzeugt und zurück gibt oder? (Meyers-Singleton)
    So gen Richtugn:

    public:
            static Config& GetInstanz() 
            {
    
                static Config Instanz;
                return Instanz;
            }
    

    Oder sehe ich das falsch??
    Eigentlich müsste´s das doch alles sein, um das Singleton zu implementieren oder??



  • Den Copy-Ctor und operator= kannst du undefiniert stehen lassen (schließlich willst du deine Objete nicht kopieren/zuweisen) - die explizite Deklaration ist auch nur notwendig, um zu verhindern, daß der Compiler sie selber anlegt (die impliziten Versionen davon wären public). Den Default-Ctor und Destruktor brauchst du schon, um dein (einziges) Config-Objekt anlegen und zerstören zu können.

    Ansonsten reicht der Singleton so für den Hausgebrauch durchaus aus.



  • Hab heut erst Zeit gefunden das mal zu testen... FOlgende Fehler werfen sich vor mich...

    if(pos->Type!=READ_ONLY)
    

    Bringt folgendes: error: 'struct std::pair<const std::string, MyConfigStructure>' has no member named 'Type'

    das gleiche auch für den member 'Value'

    Warum ist das so?

    EDIT:
    Ist es korrekt, wenn ich es in:

    pos->second.Type
    

    ändere, weil ich ja auf das 2te element zugreifen will, bzw. auf den 2ten Typen?



  • Steht doch da: Weil du mit "pos->" kein MyConfigStructure ansprichst, sondern ein pair<const string, MyConfigStructure>. Wenn du an das MyConfigStructure willst, dann nimm pos->second.Type.



  • Jetzt klappt alles, danke 🙂


Anmelden zum Antworten