<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nur eine Instanz einer Klasse im gesamten Projekt zulassen]]></title><description><![CDATA[<p>Hi,</p>
<p>wie schaffe ich es, dass nur eine einzige Instanz einer Klasse erstellt werden kann?</p>
<pre><code class="language-cpp">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 &amp;getName() const { return mName; }
    flags_t getFlags() const { return mFlags; }

    //Datei Ein-/Ausgabe
    void Load (ifstream &amp;stream);
    void Save (ofstream &amp;stream);

protected:
    //Es darf kein Charakter von &quot;außen&quot; erstellt werden. Zugriff nur über
    //CCharacterCollection möglich
    CCharacter (const string &amp;pName, uint pStrength, uint pMana, uint pLife,
                int pArmor, uint pSpeed, flags_t pFlags);
    //CCharacter direkt auf Basis von Datei erstellen
    CCharacter (ifstream &amp;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 &quot;c&quot; 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 &amp;stream);
    void Save (ofstream &amp;stream);
    void MakeNewCharacter (const string &amp;pName, uint pStrength, uint pMana, uint pLife,
        int pArmor, uint pSpeed, CCharacter::flags_t pFlags);
    const CCharacter *getCharacter (const string &amp;pName);
    const CCharacter *getLastInList();
    void DeleteCharacter (const string &amp;pName);
    void Clear();
protected:
    CCharacterCollection ();
    ~CCharacterCollection ();

    static CCharacterCollection *s_collection;

    typedef map &lt;string, CCharacter *&gt;  map_type_t;
    map_type_t mCharacters;
    map_type_t::iterator itor, end;
    CCharacter *lastAdded;

};

CCharacterCollection *CCharacterCollection::s_collection = new CCharacterCollection ();
</code></pre>
<p>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.</p>
<p>creature.obj : error LNK2005: &quot;protected: static class CCharacterCollection * CCharacterCollection::s_collection&quot; (?s_collection@CCharacterCollection@@1PAV1@A) already defined in character.obj</p>
<p>Kann mir jemand sagen, wie ich das lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136027/nur-eine-instanz-einer-klasse-im-gesamten-projekt-zulassen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 06:25:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136027.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Feb 2006 19:00:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nur eine Instanz einer Klasse im gesamten Projekt zulassen on Mon, 06 Feb 2006 19:00:54 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie schaffe ich es, dass nur eine einzige Instanz einer Klasse erstellt werden kann?</p>
<pre><code class="language-cpp">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 &amp;getName() const { return mName; }
    flags_t getFlags() const { return mFlags; }

    //Datei Ein-/Ausgabe
    void Load (ifstream &amp;stream);
    void Save (ofstream &amp;stream);

protected:
    //Es darf kein Charakter von &quot;außen&quot; erstellt werden. Zugriff nur über
    //CCharacterCollection möglich
    CCharacter (const string &amp;pName, uint pStrength, uint pMana, uint pLife,
                int pArmor, uint pSpeed, flags_t pFlags);
    //CCharacter direkt auf Basis von Datei erstellen
    CCharacter (ifstream &amp;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 &quot;c&quot; 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 &amp;stream);
    void Save (ofstream &amp;stream);
    void MakeNewCharacter (const string &amp;pName, uint pStrength, uint pMana, uint pLife,
        int pArmor, uint pSpeed, CCharacter::flags_t pFlags);
    const CCharacter *getCharacter (const string &amp;pName);
    const CCharacter *getLastInList();
    void DeleteCharacter (const string &amp;pName);
    void Clear();
protected:
    CCharacterCollection ();
    ~CCharacterCollection ();

    static CCharacterCollection *s_collection;

    typedef map &lt;string, CCharacter *&gt;  map_type_t;
    map_type_t mCharacters;
    map_type_t::iterator itor, end;
    CCharacter *lastAdded;

};

CCharacterCollection *CCharacterCollection::s_collection = new CCharacterCollection ();
</code></pre>
<p>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.</p>
<p>creature.obj : error LNK2005: &quot;protected: static class CCharacterCollection * CCharacterCollection::s_collection&quot; (?s_collection@CCharacterCollection@@1PAV1@A) already defined in character.obj</p>
<p>Kann mir jemand sagen, wie ich das lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/987882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/987882</guid><dc:creator><![CDATA[BlackVampire]]></dc:creator><pubDate>Mon, 06 Feb 2006 19:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Nur eine Instanz einer Klasse im gesamten Projekt zulassen on Mon, 06 Feb 2006 19:21:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">CCharacterCollection *CCharacterCollection::s_collection = new CCharacterCollection ();
</code></pre>
<p>Das muss raus aus dem header und in eine .cpp<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/987916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/987916</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 06 Feb 2006 19:21:31 GMT</pubDate></item></channel></rss>