<?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-Eigenschaft erben]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein Problem, über das wahrscheinlich jeder irgendwann stolpert... Meine googelei hat ergeben, dass es anscheinend keine (zufriedenstellende) Lösung für dieses Problem gibt. Nun möchte ich hier eine Diskussion über &quot;das kleinste Übel&quot; der möglichen Workarounds anregen:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class base_t {

	private:

		static T *m_singleton;

	private:
		base_t( ) { };
		base_t( const base_t &amp; ) { };
		base_t&amp; operator=( const base_t &amp; ) { };

	public:

		static T&amp; get_instance( );

		virtual ~base_t( ) = 0 { };
};

template&lt; typename T &gt;
T *base_t&lt; T &gt;::m_singleton = 0;

template&lt; typename T &gt;
T&amp; base_t&lt; T &gt;::get_instance( ) {

	if( !m_singleton ) {

		m_singleton = new T( );
	}

	return *m_singleton;
}

class derived_t : public base_t&lt; derived_t &gt; {

	public:
		void say_hello( );
};
</code></pre>
<p>Soweit, so schlecht. Funktioniert natürlich nicht, da der c-tor der Basisklasse nicht für die abgeleitete Klasse zugreifbar ist.</p>
<p>a) in <code>basis_t</code> : <code>frient T;</code><br />
b) Standard-c-tor der Basisklasse <code>protected;</code><br />
c) ???</p>
<p>Also, wie denn nun?</p>
<p>PS: Wird es denn in C++0x eine Lösung dafür geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205640/singleton-eigenschaft-erben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 10:29:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205640.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Feb 2008 01:30:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton-Eigenschaft erben on Sat, 16 Feb 2008 02:37:02 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein Problem, über das wahrscheinlich jeder irgendwann stolpert... Meine googelei hat ergeben, dass es anscheinend keine (zufriedenstellende) Lösung für dieses Problem gibt. Nun möchte ich hier eine Diskussion über &quot;das kleinste Übel&quot; der möglichen Workarounds anregen:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class base_t {

	private:

		static T *m_singleton;

	private:
		base_t( ) { };
		base_t( const base_t &amp; ) { };
		base_t&amp; operator=( const base_t &amp; ) { };

	public:

		static T&amp; get_instance( );

		virtual ~base_t( ) = 0 { };
};

template&lt; typename T &gt;
T *base_t&lt; T &gt;::m_singleton = 0;

template&lt; typename T &gt;
T&amp; base_t&lt; T &gt;::get_instance( ) {

	if( !m_singleton ) {

		m_singleton = new T( );
	}

	return *m_singleton;
}

class derived_t : public base_t&lt; derived_t &gt; {

	public:
		void say_hello( );
};
</code></pre>
<p>Soweit, so schlecht. Funktioniert natürlich nicht, da der c-tor der Basisklasse nicht für die abgeleitete Klasse zugreifbar ist.</p>
<p>a) in <code>basis_t</code> : <code>frient T;</code><br />
b) Standard-c-tor der Basisklasse <code>protected;</code><br />
c) ???</p>
<p>Also, wie denn nun?</p>
<p>PS: Wird es denn in C++0x eine Lösung dafür geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456980</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 16 Feb 2008 02:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton-Eigenschaft erben on Sat, 16 Feb 2008 09:12:28 GMT]]></title><description><![CDATA[<p>Was spricht denn gegen die 2. Variante? Wenn du von base_t erben willst, dann sollte doch der Konstruktor mindestens 'protected' sein.</p>
<p>Du scheinst auch einen nicht ganz standard-konformen Compiler zu benutzen (MSVC?). Statt &quot;virtual ~base_t( ) = 0 { };&quot; müßtest du eigentlich die Definition noch mal separat hinschreiben.<br />
Auch ein &quot;friend T&quot; ist nicht standardkonform (wird aber auch vom MSVC unterstützt), soll aber bei C++0x erlaubt werden (siehe query_boy's Artikel: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-204654.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-204654.html</a>).</p>
<p>Außerdem brauchst (bzw. solltest) du den Destruktor nicht virtuell zu deklarieren. Du wirst ja schließlich keine Polymorphie bei einem Singleton einsetzen wollen -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1457008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1457008</guid><dc:creator><![CDATA[~Single]]></dc:creator><pubDate>Sat, 16 Feb 2008 09:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton-Eigenschaft erben on Sat, 16 Feb 2008 18:03:05 GMT]]></title><description><![CDATA[<p>~Single schrieb:</p>
<blockquote>
<p>Was spricht denn gegen die 2. Variante?</p>
</blockquote>
<p>... dass wieder alles Essig ist, mit meinem Singleton. Da kann ich mir den Aufwand gleich sparen.</p>
<p>~Single schrieb:</p>
<blockquote>
<p>Du scheinst auch einen nicht ganz standard-konformen Compiler zu benutzen (MSVC?). Statt &quot;virtual ~base_t( ) = 0 { };&quot; müßtest du eigentlich die Definition noch mal separat hinschreiben.</p>
</blockquote>
<p>Geändert.</p>
<p>~Single schrieb:</p>
<blockquote>
<p>Auch ein &quot;friend T&quot; ist nicht standardkonform (wird aber auch vom MSVC unterstützt), soll aber bei C++0x erlaubt werden.</p>
</blockquote>
<p>Dann soll's mir recht sein.</p>
<p>Lösung hab' ich immer noch keine. Gibt es sie?</p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1457206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1457206</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 16 Feb 2008 18:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton-Eigenschaft erben on Sat, 16 Feb 2008 19:19:06 GMT]]></title><description><![CDATA[<p>Ich halte eine Singletonbasisklasse nicht so günstig:<br />
- der Singletonmechanismus hängt an einem Punkt von der eigentlichen Klasse ab: dort, wo das Objekt erzeugt bzw. zerstört wird<br />
- umgekehrt gibt es keine Abhängigkeit der eigentlichen Klasse von der Singletonbasis, lediglich von den durch sie durchgesetzten Garantien</p>
<p>IMO ist es daher sinnvoller, die Vererbung anders herum ablaufen zu lassen:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class singleton : public T {
    private:
        static singleton* m_instance;
    private:
        singleton() {}
        singleton(singleton&amp;);
        void operator=(singleton&amp;);
    public:
        static singleton&amp; get_instance();
};

template&lt; typename T &gt;
singleton&lt; T &gt;* singleton&lt; T &gt;::m_instance = 0;

template&lt; typename T &gt;
singleton&lt; T &gt;&amp; singleton&lt; T &gt;::get_instance() {
    if( !m_instance ) {
        m_instance = new singleton&lt; T &gt;;
    }
    return *m_instance;
}

class some_class_impl_t {
    friend class singleton&lt; some_class_impl_t &gt;;
    private:
        ~some_class_impl_t() {}
    public:
        void say_hello();
};

typedef singleton&lt; some_class_impl_t &gt; some_class_t;
</code></pre>
<p>Letzten Monat hat ein Review einer Singletonbibliothek bei boost stattgefunden. Ich hab mir das nicht angeschaut, aber vielleicht gibt es dort ein paar interessante Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1457234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1457234</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 16 Feb 2008 19:19:06 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton-Eigenschaft erben on Sat, 16 Feb 2008 20:11:11 GMT]]></title><description><![CDATA[<p>Ich hab' bei meinen Recherchen die Singleton Bibliothek gefunden, auch das Review Announcement, konnte aber die einzelnen Reviews nicht finden?</p>
<p>Deine Lösung finde ich schon ganz passabel! <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>Hab' noch den Rückgabetyp von <code>singleton::get_instance( )</code> geändert:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class singleton : public T {

	private:

		static T* m_instance;

		singleton( ) { }
		singleton( singleton&amp; );

                singleton&lt; T &gt;&amp; operator=( const singleton &amp; );
                // ^^ Sag' mal, warum kann ich mir den Rückgabetyp sparen?

	public:

		static T&amp; get_instance( );
};

template&lt; typename T &gt;
T* singleton&lt; T &gt;::m_instance = 0;

template&lt; typename T &gt;
T&amp; singleton&lt; T &gt;::get_instance() {

	if( !m_instance ) {

		m_instance = new T;
	}

	return *m_instance;
}

class some_class_impl_t {

	friend class singleton&lt; some_class_impl_t &gt;;

	private:
		~some_class_impl_t( ) { }
};
</code></pre>
<p>Somit hängt die Singleton-Eigenschaft nur noch von einem privatem dtor des &quot;Clients&quot; (&lt;-ist die Bezeichnung möglich?) ab, wenn ich das richtig sehe?</p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1457251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1457251</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 16 Feb 2008 20:11:11 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton-Eigenschaft erben on Sun, 17 Feb 2008 10:48:17 GMT]]></title><description><![CDATA[<blockquote>
<p>// ^^ Sag' mal, warum kann ich mir den Rückgabetyp sparen?</p>
</blockquote>
<p>Da es ja keine Definition des Operators gibt, ist der Rückgabetyp völlig egal (der für die Signatur einer Funktion/Methode/Operator ja keine Rolle spielt).</p>
<blockquote>
<p>Somit hängt die Singleton-Eigenschaft nur noch von einem privatem dtor des &quot;Clients&quot; (&lt;-ist die Bezeichnung möglich?) ab, wenn ich das richtig sehe?</p>
</blockquote>
<p>Der Destruktor ist deshalb privat, damit eben von außen kein Objekt dieser Klasse erzeugt werden kann. Deshalb ist aber auch die friend-Anweisung wichtig, damit die Singleton-Klasse als einzige so ein Objekt erzeugen kann.</p>
<p>Und dies ist m.E. auch der Grund, warum es so schwierig ist, eine allgemeingültige Singleton-Template-Klasse zu entwerfen (egal in welcher Richtung: als Basisklasse oder aber umgekehrt). Es gibt immer irgendwelche Regeln, die man beim Entwerfen der &quot;eingebetteten&quot; Klasse beachten muß.<br />
Ich selber mag diese friend-Anweisung nicht...<br />
Bei meiner letzten Firma gab es auch so eine Singleton-Klasse. Dort wurde das dann mithilfe eines Makros &quot;IS_SINGLETON&quot; gelöst...</p>
<p>Mal schauen, ob es bald bei Boost so eine Klasse gibt. Aber ich befüchte, es wird ebensowenig angenommen, wie bei dem Pimpl-Vorschlag.</p>
<p>Und nun noch zum letzten Punkt:</p>
<blockquote>
<p>Hab' noch den Rückgabetyp von singleton::get_instance( ) geändert</p>
</blockquote>
<p>Wenn du direkt T&amp; (statt singleton&lt;T&gt;&amp;) verwendest, dann brauchst du auch nicht mehr von T erben.<br />
Und dies wäre dann eine dritte Möglichkeit einer Singleton-Implementierung (ohne Vererbung)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1457430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1457430</guid><dc:creator><![CDATA[~Single]]></dc:creator><pubDate>Sun, 17 Feb 2008 10:48:17 GMT</pubDate></item></channel></rss>