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