<?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]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Klasse, die nur einmal existieren darf, und dessen Werte nur von einer anderen Klasse verändert werden dürfen.<br />
Um das zu erreichen habe ich solch ein Singleton konstruiert:</p>
<pre><code class="language-cpp">// Header
#ifndef WINDOWDIMENSION_H
#define WINDOWDIMENSION_H

class WindowDimension {
public:
	static WindowDimension* Get();
	~WindowDimension();
	int Width() const {return width;};
	int Height() const {return height;};
protected:
	void SetDimension(int windowWidth, int windowHeight);
	WindowDimension();
private:
	int width, height;
	static WindowDimension* instance;

};

#endif

// .cpp
#include &quot;WindowDimension.h&quot;

WindowDimension::WindowDimension() : width(0), height(0) {};

WindowDimension::~WindowDimension() {
	delete instance;
	instance = 0;
};

WindowDimension* WindowDimension::Get() {
	if (!instance)
		instance = new WindowDimension;
	return instance;
};

void WindowDimension::SetDimension(int windowWidth, int windowHeight) {
	width = windowWidth;
	height = windowHeight;
}

WindowDimension* WindowDimension::instance = nullptr;
</code></pre>
<p>Die Klasse, die die Werte verändern darf erbt privat von der WindowDimension-Klasse.<br />
Dabei habe ich doch einige Probleme:<br />
1. Momentan rufe ich SetDimension so auf:</p>
<pre><code class="language-cpp">WindowDimension::SetDimension(init.width, init.height);
</code></pre>
<p>Dabei glaube ich aber selber, dass das Verhalten undefiniert ist. Mein Problem ist aber, dass solch ein Aufruf nicht funktioniert:</p>
<pre><code class="language-cpp">WindowDimension::Get()-&gt;SetDimension(init.width, init.height);
</code></pre>
<p>Folgender Compilerfehler kommt:</p>
<pre><code>error C2248: &quot;WindowDimension::SetDimension&quot;: Kein Zugriff auf private Member, dessen Deklaration in der WindowDimension-Klasse erfolgte.
</code></pre>
<p>Dabei ist SetDimension doch protected und sollte doch von einer Klasse, die davon privat erbt aufgeruft werden können, oder?</p>
<p>2. Wenn ich die Width() oder Height() Funktion so aufrufe:</p>
<pre><code class="language-cpp">WindowDimension::Get()-&gt;Width();
// oder
WindowDimension::Get()-&gt;Height();
</code></pre>
<p>also ein Objekt erstelle wird im Destruktor von WindowDimension beim schließen des Programm folgende Exception geworfen:</p>
<pre><code>Eine Ausnahme (erste Chance) bei 0x010a1cf9 in Program.exe: 0xC00000FD: Stack overflow.
Unbehandelte Ausnahme bei 0x010a1cf9 in Program.exe: 0xC00000FD: Stack overflow.
</code></pre>
<p>Wieso habe ich hier auf einmal einen Stackoverflow?</p>
<p>Danke schonmal für eure Hilfe <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285343/problem-mit-singleton</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 10:27:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285343.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Apr 2011 16:53:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 16:53:42 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Klasse, die nur einmal existieren darf, und dessen Werte nur von einer anderen Klasse verändert werden dürfen.<br />
Um das zu erreichen habe ich solch ein Singleton konstruiert:</p>
<pre><code class="language-cpp">// Header
#ifndef WINDOWDIMENSION_H
#define WINDOWDIMENSION_H

class WindowDimension {
public:
	static WindowDimension* Get();
	~WindowDimension();
	int Width() const {return width;};
	int Height() const {return height;};
protected:
	void SetDimension(int windowWidth, int windowHeight);
	WindowDimension();
private:
	int width, height;
	static WindowDimension* instance;

};

#endif

// .cpp
#include &quot;WindowDimension.h&quot;

WindowDimension::WindowDimension() : width(0), height(0) {};

WindowDimension::~WindowDimension() {
	delete instance;
	instance = 0;
};

WindowDimension* WindowDimension::Get() {
	if (!instance)
		instance = new WindowDimension;
	return instance;
};

void WindowDimension::SetDimension(int windowWidth, int windowHeight) {
	width = windowWidth;
	height = windowHeight;
}

WindowDimension* WindowDimension::instance = nullptr;
</code></pre>
<p>Die Klasse, die die Werte verändern darf erbt privat von der WindowDimension-Klasse.<br />
Dabei habe ich doch einige Probleme:<br />
1. Momentan rufe ich SetDimension so auf:</p>
<pre><code class="language-cpp">WindowDimension::SetDimension(init.width, init.height);
</code></pre>
<p>Dabei glaube ich aber selber, dass das Verhalten undefiniert ist. Mein Problem ist aber, dass solch ein Aufruf nicht funktioniert:</p>
<pre><code class="language-cpp">WindowDimension::Get()-&gt;SetDimension(init.width, init.height);
</code></pre>
<p>Folgender Compilerfehler kommt:</p>
<pre><code>error C2248: &quot;WindowDimension::SetDimension&quot;: Kein Zugriff auf private Member, dessen Deklaration in der WindowDimension-Klasse erfolgte.
</code></pre>
<p>Dabei ist SetDimension doch protected und sollte doch von einer Klasse, die davon privat erbt aufgeruft werden können, oder?</p>
<p>2. Wenn ich die Width() oder Height() Funktion so aufrufe:</p>
<pre><code class="language-cpp">WindowDimension::Get()-&gt;Width();
// oder
WindowDimension::Get()-&gt;Height();
</code></pre>
<p>also ein Objekt erstelle wird im Destruktor von WindowDimension beim schließen des Programm folgende Exception geworfen:</p>
<pre><code>Eine Ausnahme (erste Chance) bei 0x010a1cf9 in Program.exe: 0xC00000FD: Stack overflow.
Unbehandelte Ausnahme bei 0x010a1cf9 in Program.exe: 0xC00000FD: Stack overflow.
</code></pre>
<p>Wieso habe ich hier auf einmal einen Stackoverflow?</p>
<p>Danke schonmal für eure Hilfe <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051247</guid><dc:creator><![CDATA[Pikkolini]]></dc:creator><pubDate>Mon, 18 Apr 2011 16:53:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 17:03:54 GMT]]></title><description><![CDATA[<p>Vielleicht solltest du das statt über Vererbung lieber über <code>friend</code> lösen.</p>
<p>p.s.</p>
<blockquote>
<p>Wieso habe ich hier auf einmal einen Stackoverflow?</p>
</blockquote>
<p>Weil er sich selbst rekursiv aufruft (über <code>delete instance</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051251</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 18 Apr 2011 17:03:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 17:04:48 GMT]]></title><description><![CDATA[<p>Dir ist hoffentlich klar, daß du mit der (selbst privaten) Vererbung den Sinn deines Singleton untergräbst? Du kannst zwar keine weiteren WindowDimension-Objekte anlegen, aber Objekte deiner Steuerklasse - und die haben auch jeweils ein WindowDimension-Teilobjekt.<br />
Und nebenbei erzeugt der Destruktor eine Endlos-Rekursion - bei Freigabe des Kontroll-Objekts wird auch dessen WD-Anteil zerstört, dieser löscht die globale Instanz, wodurch du wieder im Destruktor landest.</p>
<p>Was genau hast du denn mit dieser Kombination vor? Vielleicht ist es besser, die Zugriffsklasse nicht als Kind des Singleton anzulegen, sondern als friend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051255</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 18 Apr 2011 17:04:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 17:05:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn Du erbst, erzeugst Du ein zweites Singleton.</p>
<blockquote>
<p>Dabei ist SetDimension doch protected und sollte doch von einer Klasse, die davon privat erbt aufgeruft werden können, oder?</p>
</blockquote>
<p>Aber nur innerhalb Deiner Klasse. Hast Du Mal probiert, ohne das WindowDimension die Get-Methode aufzurufen?</p>
<p>Den zweiten Fehler kann ich gerade nicht erklären. Aber die private Vererbung für deinen Zweck scheint nicht sehr sinnvoll. Was mir in erster Linie einleuchten würde, wäre die Klassen zusammenzuschieben oder ein friend anzubieten. Blöderweise könnte man durch das friend dann auch das Singleton mehrfach erzeugen. Deswegen könntest Du eine Zwischenklasse anbieten. Mediator könnte ein Freund von dem Singleton sein und ein paar private Methoden anbieten. Mediator hat dann wiederum deine verändernde Klasse als Freund, aber bietet nur die Zugriffsmethoden an, die die verändernde Klasse besitzen soll.</p>
<p>Ist zwar auch etwas umständlich, aber die private Vererbung erscheint mir irgendwie nicht sinnvoll. Oder du schiebst das Singleton und die andere Klasse eben zusammen, vielleicht ergibt das Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051257</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 18 Apr 2011 17:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 17:12:40 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten.<br />
Also das mit dem rekursiven Destruktor habe ich jetzt verstanden aber wie krieg ich die Rekursion weg? Ein <code>friend</code> erscheint mir jetzt auch sinnvoller, aber wieso kann man mit einem <code>friend</code> ein Singleton mehrmals erzeugen und wann wird es mehrmals erzeugt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051264</guid><dc:creator><![CDATA[Pikkolini]]></dc:creator><pubDate>Mon, 18 Apr 2011 17:12:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 17:14:41 GMT]]></title><description><![CDATA[<p>Na ja, überlege Dir Mal, wieso man ein Singleton normalerweise nicht mehrfach erzeugen kann. Dann siehst Du, dass friend das aushebelt. Der verantwortliche Programmierer wird das natürlich auch nicht ausnutzen, aber die befreundete Klasse erhält grundsätzlich die Möglichkeit zum Mehrfacherzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051265</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 18 Apr 2011 17:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton on Mon, 18 Apr 2011 17:20:07 GMT]]></title><description><![CDATA[<p>Pikkolini schrieb:</p>
<blockquote>
<p>Danke für eure Antworten.<br />
Also das mit dem rekursiven Destruktor habe ich jetzt verstanden aber wie krieg ich die Rekursion weg?</p>
</blockquote>
<p>Die Rekursion kannst du normalerweise verhindern, indem du den rekursiven Funktionsaufruf weglässt - in deinem Fall ist das das <code>delete instance;</code> . Es gibt übrigens auch bessere Möglichkeiten, ein Singleton anzulegen als über den Heap (eine elegantere und stabilere Variante ist eine statische Variable innerhalb der get()-Methode)</p>
<blockquote>
<p>Ein <code>friend</code> erscheint mir jetzt auch sinnvoller, aber wieso kann man mit einem <code>friend</code> ein Singleton mehrmals erzeugen und wann wird es mehrmals erzeugt?</p>
</blockquote>
<p>Ein friend hat Zugriff auf die privaten Elemente der Klasse, also auch auf die Konstruktoren, die du so sorgfältig geschützt hast. Das heißt auch, daß du in einer Methode der friend-Klasse eine lokale Singleton-Instanz erzeugen könntest.<br />
(aber imho ist das nicht wirklich kritisch, schließlich gehören die Klassen sowieso zusammen und der Entwickler weiß selber, daß er sowas nicht machen sollte)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051271</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 18 Apr 2011 17:20:07 GMT</pubDate></item></channel></rss>