Nur eine Instanz einer Klasse im gesamten Projekt zulassen



  • Hi,

    wie schaffe ich es, dass nur eine einzige Instanz einer Klasse erstellt werden kann?

    class CCharacter
    {
    public:
        //CCharacterCollection erlauben auf CCharacter zu zu greifen
        friend class CCharacterCollection;
    
        //flags: Art der Fortbewegung und Gesinnung des Charakters festlegen
        struct flags_t
        {
            uint movement : 2;
            uint attitude : 2;
        };
    
        enum Movement { move_Fly = 0, move_Walk = 1, move_Swim = 2, move_Dig = 3 };
        enum Attitude { att_Evil = 0, att_Good = 1, att_Neutral = 2 };
    
        //Lesezugriff auf die Felder
        uint getStrength() const { return mStrength; }
        uint getMana() const {return mMana; }
        uint getLife() const { return mLife; }
        int getArmor() const { return mArmor; }
        uint getSpeed() const { return mSpeed; }
        const string &getName() const { return mName; }
        flags_t getFlags() const { return mFlags; }
    
        //Datei Ein-/Ausgabe
        void Load (ifstream &stream);
        void Save (ofstream &stream);
    
    protected:
        //Es darf kein Charakter von "außen" erstellt werden. Zugriff nur über
        //CCharacterCollection möglich
        CCharacter (const string &pName, uint pStrength, uint pMana, uint pLife,
                    int pArmor, uint pSpeed, flags_t pFlags);
        //CCharacter direkt auf Basis von Datei erstellen
        CCharacter (ifstream &stream);
        ~CCharacter ();
    
        //Startwerte für jede Creature.
    
        //Angriffsstärke
        uint mStrength;
        //Zauberkraft
        uint mMana;
        //Lebensenergie
        uint mLife;
        //Geschwindigkeit der Fortbewegung
        uint mSpeed;
        //Rüstung: im Kampf verursachter Schaden = Störke des Angreifers + Rüstung des Verteidigers
        //Rüstung negativ, damit Rüstung Schaden verringern kann
        int mArmor;
    
        flags_t mFlags;
        //Name der Rasse, der eine Kreatur vom Character "c" angehört (z.B. Troll)
        string mName;
        //Grafik, die diesen Charakter darstellt.
        //Graphics::TBitmap *mBmp;
    };
    
    class CCharacterCollection
    {
    public:
        static CCharacterCollection *get () { return s_collection; }
    
        void Load (ifstream &stream);
        void Save (ofstream &stream);
        void MakeNewCharacter (const string &pName, uint pStrength, uint pMana, uint pLife,
            int pArmor, uint pSpeed, CCharacter::flags_t pFlags);
        const CCharacter *getCharacter (const string &pName);
        const CCharacter *getLastInList();
        void DeleteCharacter (const string &pName);
        void Clear();
    protected:
        CCharacterCollection ();
        ~CCharacterCollection ();
    
        static CCharacterCollection *s_collection;
    
        typedef map <string, CCharacter *>  map_type_t;
        map_type_t mCharacters;
        map_type_t::iterator itor, end;
        CCharacter *lastAdded;
    
    };
    
    CCharacterCollection *CCharacterCollection::s_collection = new CCharacterCollection ();
    

    Mit diesen beiden Klassen soll erreicht werden, dass jede Instanz von CCharacter exakt einmal existiert, und zwar in der CCharacterCollection. WEnn ich nun eine Klasse CCreature erstelle und dieser im Konstructor eine Referenz auf ein CCharacter-Object übergebe und weiterhin eine Klasse CHero, die von CCreature abgeleitet ist erstelle, bekomme ich den folgenden Fehler.

    creature.obj : error LNK2005: "protected: static class CCharacterCollection * CCharacterCollection::s_collection" (?s_collection@CCharacterCollection@@1PAV1@A) already defined in character.obj

    Kann mir jemand sagen, wie ich das lösen kann?



  • CCharacterCollection *CCharacterCollection::s_collection = new CCharacterCollection ();
    

    Das muss raus aus dem header und in eine .cpp
    Kurt


Anmelden zum Antworten