<?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[Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot;]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein Problem mit einem Singleton.</p>
<p>Im Prinzip sagt ja die Fehlermeldung<br />
&quot;Kein Zugriff auf private Member, dessen Deklaration in der Application-Klasse erfolgte&quot;</p>
<p>das ich auf einen privaten Member zugreifen will, das ist aber in diesem Fall (glaub ich) nicht so ...</p>
<p>Singleton.hpp</p>
<pre><code class="language-cpp">#ifndef Singleton_hpp
#define Singleton_hpp

template &lt;class T&gt;
class Singleton
{
protected:
	static T* singleton;

public:
	inline static T* Get()
	{
		if (!singleton)
			singleton = new T(); //Hier zeigt er die Meldung an

		return singleton;
	}

	static void Destroy()
	{
		delete singleton;
	}
};

template &lt;class T&gt;
T* Singleton&lt;T&gt;::singleton = NULL;

#endif //Singleton_hpp
</code></pre>
<p>Application.hpp</p>
<pre><code class="language-cpp">#ifndef Application_hpp
#define Application_hpp

#include &quot;Singleton.hpp&quot;

#define App (*(Application::Get()))

class Application : public Singleton&lt;Application&gt;
{
private:
	Application() : x(0), y(0.f){}
	~Application(){ Singleton&lt;Application&gt;::Destroy(); }

	Application(int x) : x(x), y(0.f){}

	Application(float y) : x(0), y(0.f){}

private:
	int x;
	float y;

public:
	int GetX(){ return x; }
	float GetY(){ return y; }
};

#endif //Application_hpp
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;Application.hpp&quot;
#include &lt;iostream&gt;

int main()
{
	std::cout &lt;&lt; App.GetX() &lt;&lt; std::endl;
	std::cout &lt;&lt; App.GetY() &lt;&lt; std::endl;

	std::cin.get();
}
</code></pre>
<p>Meiner Meinung nach, rufe ich doch dann mit</p>
<pre><code class="language-cpp">App.GetX();
//das hier auf
Application.Get().GetX();
</code></pre>
<p>Mit Application.Get() kann ich doch auf den privaten Konstruktor von Application zugreifen, oder nicht?</p>
<p>Was ich noch erreichen will, aber erst später hinzu kommt, sind verschiedene Konstruktoren in Application, die ich zum Initialisieren beim 1. mal benutzten möchte, dh ich habe mehrere Konstruktoren und definiere in etwa so etwas:</p>
<pre><code class="language-cpp">#define App (*(Application::Get))

//und
class Application
{
...
public:
    static Application* Get(int x);
    static Application* Get(float y);
...
}
</code></pre>
<p>Und dann hier sowas:</p>
<pre><code class="language-cpp">App(1); //Initialisierung mit einem Integer
App(1.f); //Initialisierung mit einem Float
App(); //Standard
</code></pre>
<p>Aber bei dem Versuch bekomme ich die Meldung, das der Compiler nicht weiß, welche Funktion er benutzen soll ...</p>
<p>IDE: VS2010 -&gt; zugehöriger Compiler</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272357/problem-mit-singleton-quot-kein-zugriff-auf-private-member-dessen-deklaration-in-der-klasse-erfolgte-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 22:24:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272357.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Aug 2010 09:29:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 09:29:08 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein Problem mit einem Singleton.</p>
<p>Im Prinzip sagt ja die Fehlermeldung<br />
&quot;Kein Zugriff auf private Member, dessen Deklaration in der Application-Klasse erfolgte&quot;</p>
<p>das ich auf einen privaten Member zugreifen will, das ist aber in diesem Fall (glaub ich) nicht so ...</p>
<p>Singleton.hpp</p>
<pre><code class="language-cpp">#ifndef Singleton_hpp
#define Singleton_hpp

template &lt;class T&gt;
class Singleton
{
protected:
	static T* singleton;

public:
	inline static T* Get()
	{
		if (!singleton)
			singleton = new T(); //Hier zeigt er die Meldung an

		return singleton;
	}

	static void Destroy()
	{
		delete singleton;
	}
};

template &lt;class T&gt;
T* Singleton&lt;T&gt;::singleton = NULL;

#endif //Singleton_hpp
</code></pre>
<p>Application.hpp</p>
<pre><code class="language-cpp">#ifndef Application_hpp
#define Application_hpp

#include &quot;Singleton.hpp&quot;

#define App (*(Application::Get()))

class Application : public Singleton&lt;Application&gt;
{
private:
	Application() : x(0), y(0.f){}
	~Application(){ Singleton&lt;Application&gt;::Destroy(); }

	Application(int x) : x(x), y(0.f){}

	Application(float y) : x(0), y(0.f){}

private:
	int x;
	float y;

public:
	int GetX(){ return x; }
	float GetY(){ return y; }
};

#endif //Application_hpp
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;Application.hpp&quot;
#include &lt;iostream&gt;

int main()
{
	std::cout &lt;&lt; App.GetX() &lt;&lt; std::endl;
	std::cout &lt;&lt; App.GetY() &lt;&lt; std::endl;

	std::cin.get();
}
</code></pre>
<p>Meiner Meinung nach, rufe ich doch dann mit</p>
<pre><code class="language-cpp">App.GetX();
//das hier auf
Application.Get().GetX();
</code></pre>
<p>Mit Application.Get() kann ich doch auf den privaten Konstruktor von Application zugreifen, oder nicht?</p>
<p>Was ich noch erreichen will, aber erst später hinzu kommt, sind verschiedene Konstruktoren in Application, die ich zum Initialisieren beim 1. mal benutzten möchte, dh ich habe mehrere Konstruktoren und definiere in etwa so etwas:</p>
<pre><code class="language-cpp">#define App (*(Application::Get))

//und
class Application
{
...
public:
    static Application* Get(int x);
    static Application* Get(float y);
...
}
</code></pre>
<p>Und dann hier sowas:</p>
<pre><code class="language-cpp">App(1); //Initialisierung mit einem Integer
App(1.f); //Initialisierung mit einem Float
App(); //Standard
</code></pre>
<p>Aber bei dem Versuch bekomme ich die Meldung, das der Compiler nicht weiß, welche Funktion er benutzen soll ...</p>
<p>IDE: VS2010 -&gt; zugehöriger Compiler</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940492</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Mon, 16 Aug 2010 09:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 09:33:51 GMT]]></title><description><![CDATA[<p>Nowis schrieb:</p>
<blockquote>
<p>Mit Application.Get() kann ich doch auf den privaten Konstruktor von Application zugreifen, oder nicht?</p>
</blockquote>
<p>Application::Get gibt's nicht, nur Singleton::Get. Und da darfst du den Konstruktor von Application nicht aufrufen, weil er private ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940495</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 16 Aug 2010 09:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 09:36:30 GMT]]></title><description><![CDATA[<p>Bedeutet das, dass ich die Konstruktoren von Application public machen müsste?, was ja aber nicht der Sinn eines Singletons ist ...</p>
<p>... oder gibt es noch andere Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940498</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Mon, 16 Aug 2010 09:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 09:37:37 GMT]]></title><description><![CDATA[<p>Nowis schrieb:</p>
<blockquote>
<p>... oder gibt es noch andere Möglichkeiten?</p>
</blockquote>
<p>Friend?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940500</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 16 Aug 2010 09:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 09:52:02 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank, das hat was geholfen ...</p>
<p>Ich habe da noch ein kleines Problem, welches sicherlich leicht zu lösen ist:<br />
bei</p>
<pre><code class="language-cpp">template &lt;class T&gt;
T* Singleton&lt;T&gt;::singleton = NULL;
</code></pre>
<p>bekomme ich die Fehlermeldung &quot;'NULL': nichtdeklarierter Bezeichner&quot;</p>
<p>Wenn ich mit der Maus über &quot;NULL&quot; gehe ist dort &quot;#define NULL 0&quot; angegeben</p>
<p>Wenn ich den Pointer nicht auf NULL setzte bekomme ich einen anderen Fehler:</p>
<pre><code>Nicht aufgelöstes externes Symbol &quot;&quot;protected: static class Application * Singleton&lt;class Application&gt;::singleton&quot; (?singleton@?$Singleton@VApplication@@@@1PAVApplication@@A)&quot; ....\main.obj
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1940507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940507</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Mon, 16 Aug 2010 09:52:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 10:20:49 GMT]]></title><description><![CDATA[<p>Schreibe 0 statt NULL oder binde &lt;cstddef&gt; ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940519</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 16 Aug 2010 10:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 10:32:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Schreibe 0 statt NULL</p>
</blockquote>
<p>Immer eine gute Idee. denn es könnte ja irgendein Schelm im Projekt mal NULL umdefinieren. Und <em>den</em> Fehler suchst du lang!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940522</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Mon, 16 Aug 2010 10:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 11:07:29 GMT]]></title><description><![CDATA[<p>Mit der Funktion Destroy schießt du dir aber auch ins Knie: sie löscht das Singleton (das aber nicht auf 0 gesetzt wird), ruft dabei den Destruktor auf, der in der Application wiederum Destroy aufruft.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940540</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 16 Aug 2010 11:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 11:28:14 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antworten,</p>
<p>das mit 0 statt NULL ist keine schlechte Idee, ich versuch mir das mal anzugewöhnen ...</p>
<p>Das mit Destroy: Sollte ich Destroy im Destruktor des Singletons(Basis) aufrufen?<br />
also</p>
<pre><code class="language-cpp">~Singleton(){ Destroy(); }
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940545</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Mon, 16 Aug 2010 11:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 11:35:52 GMT]]></title><description><![CDATA[<p>Nowis schrieb:</p>
<blockquote>
<p>...<br />
Das mit Destroy: Sollte ich Destroy im Destruktor des Singletons(Basis) aufrufen?<br />
also</p>
<pre><code class="language-cpp">~Singleton(){ Destroy(); }
</code></pre>
<p>?</p>
</blockquote>
<p>Nein, in keinem Destruktor. Die Funktion Destroy ruft (implizit über delete) den Destruktor auf. Dann darf der aber nicht wieder Destroy aufrufen, da das dann nie (naja, beim Stacküberlauf schon) endet.</p>
<p>Was willst du denn mit der Funktion erreichen? Das am Programmende der Speicher freigegeben wird? Oder soll das Singleton während das Programmablaufs neu gesetzt werden können?</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940552</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 16 Aug 2010 11:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 11:38:17 GMT]]></title><description><![CDATA[<p>Nowis schrieb:</p>
<blockquote>
<p>Das mit Destroy: Sollte ich Destroy im Destruktor des Singletons(Basis) aufrufen?</p>
</blockquote>
<p>Gleiches Problem.</p>
<p>Die Frage ist doch, wie die Zerstörung deines Singleton überhaupt ausgelöst werden soll. Soll das von allein gehen, oder muss der Benutzer etwas tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940553</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 16 Aug 2010 11:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 11:54:41 GMT]]></title><description><![CDATA[<p>Am besten beides, dh wenn ich das &quot;neu initialiseren&quot; will und halt bei Programmende den Speicher freigeben ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940560</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Mon, 16 Aug 2010 11:54:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 12:19:18 GMT]]></title><description><![CDATA[<p>Nowis schrieb:</p>
<blockquote>
<p>Am besten beides, dh wenn ich das &quot;neu initialiseren&quot; will und halt bei Programmende den Speicher freigeben ...</p>
</blockquote>
<p>Dann müsste dein Destroy so aussehen:</p>
<pre><code class="language-cpp">static void Destroy()
    {
        delete singleton;
        singleton = 0;
    }
</code></pre>
<p>Am Programmende musst du Application::Destroy() zu Fuß ausführen, oder immer dann, wenn du das Singleton neu initialisieren möchtest. Im Detruktor wird die Funktion aber nicht aufgerufen.</p>
<p>Ich glaube aber noch ein anderes Problem zu sehen: die eigentliche Singeltonvariable wird mit</p>
<pre><code class="language-cpp">template &lt;class T&gt;
T* Singleton&lt;T&gt;::singleton = NULL;
</code></pre>
<p>im Header Singleton.hpp definiert. Meiner Meinung nach erzeugst du damit mehrere Versionen in den CPPs, in denen du Applikation benutzt =&gt; ODR (one definition rule) verletzt =&gt; undefiniertes Verhalten. Ich bin mir aber nicht sicher, ob das wirklich falsch ist.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940569</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 16 Aug 2010 12:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 13:43:58 GMT]]></title><description><![CDATA[<p>Ok, die Destroy-Methode ist geändert ...</p>
<p>Aber das mit dem manuell Aufrufen ist schon ein bisschen umständlich, ich will ja später mehrere Klassen von Singleton erben lassen und das dann von allen selber aufrufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940609</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Mon, 16 Aug 2010 13:43:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 14:28:34 GMT]]></title><description><![CDATA[<p>Nowis schrieb:</p>
<blockquote>
<p>Ok, die Destroy-Methode ist geändert ...</p>
<p>Aber das mit dem manuell Aufrufen ist schon ein bisschen umständlich, ich will ja später mehrere Klassen von Singleton erben lassen und das dann von allen selber aufrufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
</blockquote>
<p>Naja, du kannst das Löschen am Ende ja auch sein lassen. Das macht das Betriebssystem sowieso. Oder du benutzt statt T* für die Membervariable singleton einen std::auto_ptr&lt;T&gt;. Dann musst du nichts manuell machen.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940629</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 16 Aug 2010 14:28:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 14:29:58 GMT]]></title><description><![CDATA[<p>Warum eigentlich den &quot;Umweg&quot; über ein Template und nicht einfach public geerbt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940630</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Mon, 16 Aug 2010 14:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 18:23:11 GMT]]></title><description><![CDATA[<p>Warum eigentlich überhaupt erben? Damit deine Klasse ein Singleton ist, musst du Konstruktoren und op= sowieso private machen, auch mit dem Template.<br />
Dann implementierst du eine einzige statische getter-Funktion im Meyer-Singleton-Stil, und alles ist paletti. Das sind pro Singleton 2 relevante Zeilen zusätzlich. Und wenn das bei dir ein untragbarer Mehraufwand ist, machst du eh was falsch, wer so viele Singletonklassen braucht gehört auf den Mond katapultiert <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/1940737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940737</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 16 Aug 2010 18:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Mon, 16 Aug 2010 20:22:19 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Warum eigentlich überhaupt erben?</p>
</blockquote>
<p>Singleton-Vererbung ist C++-Anfänger-Stil, das sieht man leider in jedem schlechten Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940771</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Mon, 16 Aug 2010 20:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Tue, 17 Aug 2010 06:13:38 GMT]]></title><description><![CDATA[<p>Vielen Dank für die vielen Antworten,</p>
<p>ich wollte mir halt eine einzige Klasse erstellen, von der ich nur noch erben muss, aber im Prinzip habt ihr recht, um ein Singleton zu erstellen braucht man ja nicht viel, das kann man dann auch jedesmal wieder machen, und die 3 Zeilen mehr Code machens dann auch nich mehr aus.</p>
<p>Ich werde euren Rat beherzigen und die Singleton Klasse über Bord werfen.</p>
<p>Baut man eigentlich bei einem Singleton einen Destruktor ein?, oder benutzt man hier nur eine Destroy / Delete-Methode?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940816</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Tue, 17 Aug 2010 06:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Tue, 17 Aug 2010 06:50:24 GMT]]></title><description><![CDATA[<p>Und gleich noch eine Frage hinterher:</p>
<p>Wie müsste ich eine Singleton-Klasse aufbauen, die mit einem auto_ptr funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940823</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Tue, 17 Aug 2010 06:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Tue, 17 Aug 2010 07:15:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Baut man eigentlich bei einem Singleton einen Destruktor ein?, oder benutzt man hier nur eine Destroy / Delete-Methode?</p>
</blockquote>
<p>Destruktor und Destroy sind verschiedene Sachen. Destroy soll das statische Objekt zerstören (mit delete), der Destruktor kümmert sich darum, dass beim Zerstören auch brav alle Member zerstört werden und der Speicher bereinigt wird.</p>
<p>Du brauchst also auch bei einem Singleton einen Destruktor, wenn du z.B. dynamisch alloziierte Member hast, oder sonst was aufgeräumt werden muss.</p>
<blockquote>
<p>Wie müsste ich eine Singleton-Klasse aufbauen, die mit einem auto_ptr funktioniert?</p>
</blockquote>
<p>Das brauchst du eigentlich auch nicht. Ich hab oben schon den &quot;Meyer Singleton&quot; erwähnt:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

struct Item {
    Item(int val)
     : value(val)
    {}
    int value;
};

class Manager {
    Manager() { std::cout &lt;&lt; &quot;Konstruktor&quot; &lt;&lt; std::endl; }
    ~Manager() { std::cout &lt;&lt; &quot;Destruktor&quot; &lt;&lt; std::endl; }
    Manager(const Manager&amp;);
    Manager&amp; operator=(const Manager&amp;);

    std::vector&lt;Item&gt; items;

public:
    static Manager&amp; get() {
        static Manager m;
        return m;
    }

    void manage(const Item&amp; i) {
        items.push_back(i);
    }

    const std::vector&lt;Item&gt;&amp; managedItems() const {
        return items;
    }
};

int main() {
    Manager::get().manage(Item(10));
    Manager::get().manage(Item(20));

    const std::vector&lt;Item&gt;&amp; items = Manager::get().managedItems();
    for(size_t i=0; i&lt;items.size(); ++i)
        std::cout &lt;&lt; items[i].value &lt;&lt; &quot; &quot;;
    std::cout &lt;&lt; std::endl;
}
</code></pre>
<p>Schau dir die get()-Funktion an. Auch den Destruktor kannst du private machen, damit niemand auf dumme Gedanken kommt :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940835</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 17 Aug 2010 07:15:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton: &amp;quot;Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte&amp;quot; on Tue, 17 Aug 2010 07:34:23 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank an alle die geantwortet haben, ich werde das in Zukunft beherzigen.</p>
<p>Alle meine Fragen sind jetzt beantwortet ....</p>
<p>CLOSED</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940845</guid><dc:creator><![CDATA[Nowis]]></dc:creator><pubDate>Tue, 17 Aug 2010 07:34:23 GMT</pubDate></item></channel></rss>