<?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[Singleton Frage]]></title><description><![CDATA[<pre><code class="language-cpp">class Singleton
 {
   private:
     //Konstruktor private, damit man sich keine Instanzen holen kann.
     Singleton();
     //Den Kopierkonstruktor schützen um zu vermeiden, dass das Objekt unbeabsichtigt kopiert wird.
     Singleton(const Singleton&amp; cc){}

   public:
     ~Singleton();
     static Singleton* getInstance();
 };

 Singleton* Singleton::getInstance()
 {
   static Singleton instance; 
   return &amp;instance; 
 }
</code></pre>
<p>Hab das hier bei Wikipedia gefunden. Wird beim Aufruf von getInstance() jedes mal eine neue Instanz erstellt und die alte gelöscht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/190384/singleton-frage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 15:26:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190384.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Aug 2007 07:51:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton Frage on Wed, 22 Aug 2007 07:51:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Singleton
 {
   private:
     //Konstruktor private, damit man sich keine Instanzen holen kann.
     Singleton();
     //Den Kopierkonstruktor schützen um zu vermeiden, dass das Objekt unbeabsichtigt kopiert wird.
     Singleton(const Singleton&amp; cc){}

   public:
     ~Singleton();
     static Singleton* getInstance();
 };

 Singleton* Singleton::getInstance()
 {
   static Singleton instance; 
   return &amp;instance; 
 }
</code></pre>
<p>Hab das hier bei Wikipedia gefunden. Wird beim Aufruf von getInstance() jedes mal eine neue Instanz erstellt und die alte gelöscht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1349532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349532</guid><dc:creator><![CDATA[SingletonAnfänger]]></dc:creator><pubDate>Wed, 22 Aug 2007 07:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Wed, 22 Aug 2007 07:58:04 GMT]]></title><description><![CDATA[<p>Nein.<br />
Schau mal die Bedeutung von static nach. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich mache das aber normalerweise dynamisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1349540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349540</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 22 Aug 2007 07:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Wed, 22 Aug 2007 07:57:08 GMT]]></title><description><![CDATA[<p>nö, ist doch static</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1349541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349541</guid><dc:creator><![CDATA[er]]></dc:creator><pubDate>Wed, 22 Aug 2007 07:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Wed, 22 Aug 2007 10:55:01 GMT]]></title><description><![CDATA[<p>static variablen werden zur laufzeit max 1x instanziert, egal wie oft die betreffende methode aufgerufen wird...</p>
<p>simples bsp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Dummy
{ 
   static int sVar;
   int mVar;
public:
   Dummy() : mVar(0) { }

   int getMemVar()
   {
      mVar++;
      return mVar; 
   }
   static int getStaticMemVar() //muss nicht static sein, ist aber ansonsten schlechter stil
   {
      sVar++;
      return sVar; 
   }

   static int getStaticMethodVar() //muss nicht static sein, ist aber ansonsten schlechter stil
   {
      //unterschied zu getStaticMemVar: sVar wird bereits bei Programmstart allokiert
      //            währned &quot;var&quot; erst bei erstem methoden aufruf allokiert wird
      //            statische member sind immer klassengobal!
      static int var=0;
      var++;
      return var; 
   }

   int getLocalMethodVar()
   {
      int var1=0;
      var1++;
      return var1; 
   }
};

int Dummy::sVar = 0;

int main(int argc, char** argv)            
{  
   Dummy a,b,c;  //--&gt; output: 1 2 3
   //class member
   std::cout &lt;&lt; a.getMemVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; b.getMemVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; c.getMemVar() &lt;&lt;std::endl; //-&gt; output 1

   std::cout &lt;&lt; a.getMemVar() &lt;&lt;std::endl; //-&gt; output 2
   std::cout &lt;&lt; b.getMemVar() &lt;&lt;std::endl; //-&gt; output 2
   std::cout &lt;&lt; c.getMemVar() &lt;&lt;std::endl; //-&gt; output 2

   //static class member
   //eigentlich schreibt man bei statischen methoden: Dummy::getStaticMemVar();
   std::cout &lt;&lt; a.getStaticMemVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; b.getStaticMemVar() &lt;&lt;std::endl; //-&gt; output 2
   std::cout &lt;&lt; c.getStaticMemVar() &lt;&lt;std::endl; //-&gt; output 3

   std::cout &lt;&lt; a.getStaticMemVar() &lt;&lt;std::endl; //-&gt; output 4
   std::cout &lt;&lt; b.getStaticMemVar() &lt;&lt;std::endl; //-&gt; output 5
   std::cout &lt;&lt; c.getStaticMemVar() &lt;&lt;std::endl; //-&gt; output 6

   //static method var
   //eigentlich schreibt man bei statischen methoden: Dummy::getStaticMethodVar();
   std::cout &lt;&lt; a.getStaticMethodVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; b.getStaticMethodVar() &lt;&lt;std::endl; //-&gt; output 2
   std::cout &lt;&lt; c.getStaticMethodVar() &lt;&lt;std::endl; //-&gt; output 3

   std::cout &lt;&lt; a.getStaticMethodVar() &lt;&lt;std::endl; //-&gt; output 4
   std::cout &lt;&lt; b.getStaticMethodVar() &lt;&lt;std::endl; //-&gt; output 5
   std::cout &lt;&lt; c.getStaticMethodVar() &lt;&lt;std::endl; //-&gt; output 6

   //lokal method var
   std::cout &lt;&lt; a.getLocalMethodVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; b.getLocalMethodVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; c.getLocalMethodVar() &lt;&lt;std::endl; //-&gt; output 1

   std::cout &lt;&lt; a.getLocalMethodVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; b.getLocalMethodVar() &lt;&lt;std::endl; //-&gt; output 1
   std::cout &lt;&lt; c.getLocalMethodVar() &lt;&lt;std::endl; //-&gt; output 1
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1349680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349680</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 22 Aug 2007 10:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Wed, 22 Aug 2007 18:41:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class T&gt;
class Singleton
{
private:
    Singleton();
    Singleton(const Singleton&amp;){}
    Singleton&amp; operator=(const Singleton&amp;) { return *this; }

public:
    inline static T&amp; instance() { static T _inst; return _inst; }
};
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1349981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349981</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 22 Aug 2007 18:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 07:53:17 GMT]]></title><description><![CDATA[<p>@Ä(D)Evil</p>
<p>Das hatte ich schon durch die Forensuche gefunden als ich eine Singleton-Template-Factory schreiben wollte. Hat leider nicht geklappt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350218</guid><dc:creator><![CDATA[SingletonAnfänger]]></dc:creator><pubDate>Thu, 23 Aug 2007 07:53:17 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 08:03:21 GMT]]></title><description><![CDATA[<p>Was meinst du mit &quot;hat nicht geklappt&quot;?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@topic</a>: eine (lokale) static-Variable wird beim ersten Mal angelegt und initialisiert, wenn der Programmfluß über die Definition drübergeht - beim nächsten Durchlauf wird die Initialisierung übersprungen.<br />
(globale Variablen sind auch statisch - und werden vor dem Eintritt in die main() in mehr oder weniger willkürlicher Reihenfolge initialisiert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350225</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 23 Aug 2007 08:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 09:04:54 GMT]]></title><description><![CDATA[<p>Ein etwas allgemeinerer Ansatz wäre folgender:</p>
<pre><code class="language-cpp">template &lt;class T&gt; 
class CreateImplementation
{
public:
    static T *createNew(void)
    {
        return new T;
    }
};

template &lt;class T,typename CreatePolicy = CreateImplementation&lt;T&gt; &gt; 
class Singleton
{
public:
    ~Singleton()
    {
        delete _implementation;
    }

    static Singleton &amp;getInstance()
    {
		{
			CSingleLock lock(&amp;_locker, TRUE);
			if ( _instancePtr.get() == 0 ) 
				_instancePtr = std::auto_ptr&lt;Singleton&gt;(new Singleton);
		}        
		return *_instancePtr;
    }

    static bool isAvailable(void)
    {      
        if ( !_instancePtr.get() ) 
			return false;

        return ( instancePtr-&gt;_implementation != 0 );
    }

    T *operator -&gt; ()
    {
        init();
        return _implementation;
    }

    void init(void)
    {
        CSingleLock lock(&amp;_locker, TRUE);
        if ( _implementation == 0 )
		{
			_implementation = CreatePolicy::createNew();
		}
    }

    void deinit(void)
    {
		CSingleLock lock(&amp;_locker, TRUE);
        if ( _implementation )
        {
			delete _implementation;
			_implementation = 0;
		}
    }

    void restart(void)
    {
        deinit();
        init();
    }

protected:
	static CCriticalSection _locker;
	static std::auto_ptr&lt;Singleton&gt;  _instancePtr;
         T *_implementation;					
private:
    Singleton()
    {
        _implementation = 0;
    }

    Singleton(Singleton const&amp; copy);

    void operator = (Singleton const&amp; copy);
};
</code></pre>
<p>Verge</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350263</guid><dc:creator><![CDATA[xivVerge]]></dc:creator><pubDate>Thu, 23 Aug 2007 09:04:54 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 11:55:43 GMT]]></title><description><![CDATA[<p>Ok hier mein Beispiel.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;map&gt;

//////////////////////////////////////////////////////////////////////////
// Testklassen
class Value
{
public:
	Value()			{m_val = 0;}
	virtual int  Get()		{return m_val;}
protected:
	int m_val;
};

class Value1 : public Value
{
public:
	Value1()		{m_val = -1;}
	virtual int  Get()		{return m_val;}
protected:
	int m_val;
};

class Value2 : public Value
{
public:
	Value2()		{m_val = -2;}
	virtual int  Get()		{return m_val;}
protected:
	int m_val;
};

//////////////////////////////////////////////////////////////////////////
// 
template&lt;class T&gt;
class Singleton
{
public:
	static T&amp; Instance() {static T instance; return instance;}
protected:
	Singleton();
	Singleton(const Singleton&amp;);
	Singleton&amp; operator =(const Singleton&amp;);
};

//////////////////////////////////////////////////////////////////////////
// 
class Factory : public Singleton&lt;Factory&gt;
{
public:

	Value* Create(int typ)
	{
		Value* temp = NULL;		
		switch(typ)
		{
			case 1:
			{
				Value1* val = new Value1;
				m_instanceList.insert( m_instanceList.end(), std::pair&lt;Value*, int&gt;(val,0) );
				temp = val;
				break;
			}
			case 2:
			{
				Value2* val = new Value2;
				m_instanceList.insert( m_instanceList.end(), std::pair&lt;Value*, int&gt;(val,0) );
				temp = val;
				break;
			}
		}
		return temp;
	}

	void Destroy(Value* elem)
	{
		std::map&lt;Value*, int&gt;::iterator iter;
		iter = m_instanceList.find(elem);
		if(iter != m_instanceList.end())
		{
			delete iter-&gt;first;
			m_instanceList.erase(iter);
		}
	}

private:
	std::map&lt;Value*, int&gt; m_instanceList;	// int wert wird nicht ausgewertet, dient nur als dummy
};
</code></pre>
<pre><code class="language-cpp">int main(int argc, char* argv[])
{
	Value* val1 = Factory::Instance().Create(1);
	Value* val2 = Factory::Instance().Create(1);

	std::cout&lt;&lt;val1-&gt;Get()&lt;&lt;std::endl;
	std::cout&lt;&lt;val2-&gt;Get()&lt;&lt;std::endl;

	Factory::Instance().Destroy(val1);
	Factory::Instance().Destroy(val2);

	int q;
	std::cin&gt;&gt;q;

	return 0;
}
</code></pre>
<p>Ich bekomme hier beim VC 6 einen Linker Fehler und sehr viele seltsame Warnungen:</p>
<pre><code>templatetest.obj : error LNK2001: Nichtaufgeloestes externes Symbol &quot;protected: __thiscall Singleton&lt;class Factory&gt;::Singleton&lt;class Factory&gt;(void)&quot; (??0?$Singleton@VFactory@@@@IAE@XZ)
Debug/templatetest.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
</code></pre>
<pre><code>c:\Programme\Microsoft Visual Studio\VC98\INCLUDE\xtree(200) : warning C4786: '?rbegin@?$_Tree@PAVValue@@U?$pair@QAVValue@@H@std@@U_Kfn@?$map@PAVValue@@HU?$less@PAVValue@@@std@@V?$allocator@H@3@@3@U?$less@PAVValue@@@3@V?$allocator@H@3@@std@@QAE?AV?$
reverse_bidirectional_iterator@Viterator@?$_Tree@PAVValue@@U?$pair@QAVValue@@H@std@@U_Kfn@?$map@PAVValue@@HU?$less@PAVValue@@@std@@V?$allocator@H@3@@3@U?$less@PAVValue@@@3@V?$allocator@H@3@@std@@U?$pair@QAVValue@@H@3@AAU43@PAU43@H@2@XZ' : Bezeichner
 wurde auf '255' Zeichen in den Browser-Informationen reduziert
        c:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree&lt;class Value *,struct std::pair&lt;class Value * const,int&gt;,struct std::map&lt;class Value *,int,struct std::le
ss&lt;class Value *&gt;,class std::allocator&lt;int&gt; &gt;::_Kfn,struct std::less&lt;class Value *&gt;,class std::allocator&lt;int&gt; &gt;'
        C:\templatetest\templatetest.cpp(109) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map&lt;class Value *,int,struct std::less&lt;class Value *&gt;,class std::allocator&lt;int&gt; &gt;'
</code></pre>
<p>Laut MSDN sind meine Symbolnamen zu lang ( <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ). Das scheint nicht soo schlimm zu sein. Ich möchte aber trozdem nichts benutzen was so viele warnungen erzeugt.</p>
<p>Den Linkerfehler konnte ich nicht beseitigen... Keine Ahnung woran das liegen kann. Der ganze code steht in einer einzigen cpp Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350389</guid><dc:creator><![CDATA[SingletonAnfänger]]></dc:creator><pubDate>Thu, 23 Aug 2007 11:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 12:02:18 GMT]]></title><description><![CDATA[<p>SingletonAnfänger schrieb:</p>
<blockquote>
<p>Ich möchte aber trozdem nichts benutzen was so viele warnungen erzeugt.</p>
</blockquote>
<p>Zu diesem Zwecke empfehle ich:: Visual C++ 2005 Express Edition <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350393</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 23 Aug 2007 12:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 12:02:51 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">/////////////////////////////////////////////////////////////////////////
//
template&lt;class T&gt;
class Singleton
{
public:
    static T&amp; Instance() {static T instance; return instance;}
protected:
    Singleton();
    Singleton(const Singleton&amp;);
    Singleton&amp; operator =(const Singleton&amp;);
};
</code></pre>
</blockquote>
<p>Du hast deinem Singleton keinen Konstruktor definiert, nur deklariert. Ist zwar richtig dass der nur protected ist, aber es muss ihn trotzdem geben, sonst kannst du kein Objekt davon erstellen. nichtmal das einzige. Mit <code>static T instance;</code> versuchst du das aber, und der Compiler bzw. Linker meckert zu recht dass er nicht weiss wie er das bewerkstelligen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350394</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 23 Aug 2007 12:02:51 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Frage on Thu, 23 Aug 2007 12:23:55 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Du hast deinem Singleton keinen Konstruktor definiert, nur deklariert.</p>
</blockquote>
<p>Boar ich wusste das es irgend so ein sinnloser Schusselfehler ist. Danke dir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>LordJaxom  schrieb:</p>
<blockquote>
<p>SingletonAnfänger schrieb:</p>
<blockquote>
<p>Ich möchte aber trozdem nichts benutzen was so viele warnungen erzeugt.</p>
</blockquote>
<p>Zu diesem Zwecke empfehle ich:: Visual C++ 2005 Express Edition <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Mal gucken ob die Warnungen beim eVC auch noch auftauchen. Vieleicht lohnt es sich ja wirklich auf die VS 05er Express Version um zu steigen.</p>
<p>Aber mal was anderes. Ich schreibe hier so etwas wie einen Serverdienst. Der soll verschiedene Nachrichten empfangen und diese an diverse Threads zur Verarbeitung verteilen. Als Datenstruktur nehme ich dafür FIFOs.</p>
<p>Was wäre denn jetzt Designtechnisch besser (und schneller).<br />
(1) Das Nachrichtenobjekt jedesmal kopieren wenn es an eine FIFO rangehängt wird.<br />
(2)Oder sollte ich doch lieber nur deren Zeiger in den FIFOs verwalten?</p>
<p>Für 2. bräuchte ich halt meine Singleton-Template-Factory um die Objekte irgendwo zentral zu verwalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350412</guid><dc:creator><![CDATA[SingletonAnfänger]]></dc:creator><pubDate>Thu, 23 Aug 2007 12:23:55 GMT</pubDate></item></channel></rss>