<?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[Abstrakte Klasse erbt von Singleton - Fehler]]></title><description><![CDATA[<p>Ich habe eine Basisklasse für Singletons:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Singleton
{
public:
	static T&amp; GetInstance()
	{
            static T Instance;
            return Instance;
	}

	virtual ~Singleton () = 0;

protected:
	Singleton() {}

private:

	Singleton(const Singleton&amp;);
        Singleton&amp; operator=(const Singleton&amp;);
};
</code></pre>
<p>Von der lasse ich eine weitere Klasse erben (nennen wir sie Base):</p>
<pre><code class="language-cpp">template &lt;class T, class T2&gt;
class Base : public Singleton&lt;Base &lt;T, T2&gt; &gt;
{
friend class Singleton&lt;Base &lt;T, T2&gt; &gt;;
... //Die Aufgaben der Klasse etc. pp. 
};
</code></pre>
<p>Diese ist abstrakt. Von der abstrakten Klasse Base erbt eine andere Klasse (Derived), die ebenfalls auf die GetInstance-Methode zurückgreifen möchte und diesmal sogar konkret ist.</p>
<pre><code class="language-cpp">class Derived : public Base&lt;fooType1, fooType2&gt; //fooType1/2 sind nicht weiter wichtige Typen
{
... //Bla Bla
};
</code></pre>
<p>Der Aufruf von</p>
<pre><code class="language-cpp">Derived::GetInstance()
</code></pre>
<p>hat einen Compilerfehler zur Folge, da ich ja versuche, eine abstrakte Klasse zu instanzieren. Wie kann ich dieses Problem umgehen?</p>
<p>Ich denke, die Lösung ist nicht schwer, aber ich steh grad voll am Schlauch.<br />
Ich hoffe auf eure Antworten und dass ich nichts vergessen habe, was wichtig ist um das Beispiel zu verstehen.</p>
<p>MfG DonGiovanni</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243265/abstrakte-klasse-erbt-von-singleton-fehler</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:22:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243265.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Jun 2009 20:26:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Sun, 14 Jun 2009 20:26:44 GMT]]></title><description><![CDATA[<p>Ich habe eine Basisklasse für Singletons:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Singleton
{
public:
	static T&amp; GetInstance()
	{
            static T Instance;
            return Instance;
	}

	virtual ~Singleton () = 0;

protected:
	Singleton() {}

private:

	Singleton(const Singleton&amp;);
        Singleton&amp; operator=(const Singleton&amp;);
};
</code></pre>
<p>Von der lasse ich eine weitere Klasse erben (nennen wir sie Base):</p>
<pre><code class="language-cpp">template &lt;class T, class T2&gt;
class Base : public Singleton&lt;Base &lt;T, T2&gt; &gt;
{
friend class Singleton&lt;Base &lt;T, T2&gt; &gt;;
... //Die Aufgaben der Klasse etc. pp. 
};
</code></pre>
<p>Diese ist abstrakt. Von der abstrakten Klasse Base erbt eine andere Klasse (Derived), die ebenfalls auf die GetInstance-Methode zurückgreifen möchte und diesmal sogar konkret ist.</p>
<pre><code class="language-cpp">class Derived : public Base&lt;fooType1, fooType2&gt; //fooType1/2 sind nicht weiter wichtige Typen
{
... //Bla Bla
};
</code></pre>
<p>Der Aufruf von</p>
<pre><code class="language-cpp">Derived::GetInstance()
</code></pre>
<p>hat einen Compilerfehler zur Folge, da ich ja versuche, eine abstrakte Klasse zu instanzieren. Wie kann ich dieses Problem umgehen?</p>
<p>Ich denke, die Lösung ist nicht schwer, aber ich steh grad voll am Schlauch.<br />
Ich hoffe auf eure Antworten und dass ich nichts vergessen habe, was wichtig ist um das Beispiel zu verstehen.</p>
<p>MfG DonGiovanni</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726620</guid><dc:creator><![CDATA[DonGiovanni]]></dc:creator><pubDate>Sun, 14 Jun 2009 20:26:44 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Mon, 15 Jun 2009 00:09:18 GMT]]></title><description><![CDATA[<p>Wieso erbst du von Singleton und machst sie auch noch als friend Klasse?<br />
Wenn Base von Singleton erbt, dann hat auch Derived die Methoden und Eigenschaften.</p>
<p>Außerdem, &quot;hat einen Compilerfehler zu folge&quot; bringt uns nicht weiter :p Du kannst ihn uns gerne posten, das hilft uns weiter.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Wieso gebt ihr uns nie die Fehlermeldungen? Für uns sind die nicht kryptisch, wir können die lesen und sie helfen uns.</p>
</blockquote>
<p>Wenn ich deine Code so compiliere, wie du ihn gepostet hast, kommen keine Fehler, außer bei dem virtualen Dtor. Wird also wohl am Inhalt liegen.</p>
<p>Wäre also gut, wenn du uns den Fehler kopierst und ein wenig Inhalt zeigst.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726686</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 15 Jun 2009 00:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Mon, 15 Jun 2009 05:15:03 GMT]]></title><description><![CDATA[<p>Das friend lässt sich darauf zurückführen, dass diese Klassen einen geschützten Konstruktor haben und dieser ja auch aufgerufen werden muss von GetInstance.<br />
Etwas besseres als friend ist mir bisher nicht eingefallen, obwohl ich für Verbesserungen gerne offen bin.<br />
Ich habe übrigens nicht geschrieben &quot;hat einen Compilerfolge zu folge&quot;, sondern dass im Fehler darauf hingewiesen wird, dass eine abstrakte Klasse instanziert wird.<br />
Wenn du allerdings darauf bestehst, die genaue Fehlermeldung zu kennen (anstatt meines fooType2 ist hier halt std::string verwendet worde):</p>
<pre><code class="language-cpp">main.cpp|31|instantiated from here //Der Aufruf von GetInstance
Singleton.cpp|27|Fehler: Variable »Instance« kann nicht als vom abstrakten Typ »Base&lt;fooType1, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;« deklariert werden
Base.cpp|33|Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »ResourceManager&lt;fooType1, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;«:|
Base.cpp|55|Anmerkung: 	std::tr1::shared_ptr&lt;_Tp&gt; ResourceManager&lt;Type, Key&gt;::Load(const Key&amp;) [with Type = fooType1, Key = std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;]|
</code></pre>
<p>Ein wenig Inhalt habe ich bereits gezeigt, und ich denke die Problematik ist daraus eigentlich ganz gut ersichtlich. Bevor ich hier alles mit meinem Source zu mülle, würde ich gerne noch die Meinungen ein paar Anderer einholen.</p>
<p>Trotzdem danke für die schnelle (und im Bezug auf das Fehlerposten vielleicht doch gar nicht so unberechtigte) Antwort <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/1726710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726710</guid><dc:creator><![CDATA[Don Giovanni]]></dc:creator><pubDate>Mon, 15 Jun 2009 05:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Mon, 15 Jun 2009 05:31:59 GMT]]></title><description><![CDATA[<p>GetInstance ruft keinen Konstruktor von Base oder Derived auf, sondern nur den von &quot;T&quot;, und dafür brauchts maximal einen friend in T für Singleton.<br />
Denn protected-Methoden sind von abgeleiteten Klassen sehr wohl aufrufbar. Und darauf kommt es an.</p>
<p>In der Fehlermeldung steht jetzt mas von &quot;ResourceManager::load(const Key&amp;)&quot;<br />
Ist load die &quot;GetInstance()&quot;-Methode? Wenn ja warum hat die nen Parameter?</p>
<p>Zeig mal bitte was du in main() machst, und wie die load()-Methode sich über die Klassenhierarchie erstreckt.<br />
Denn &quot;abstrakter Typ Base&quot; hört sich verdammt danach an, dass du in Base in &quot;virtual T load(const Key&amp;) =0;&quot; stehen hast... Und dann kannst du maximal abgeleitete Objekte in Form eines Basisklassenzeigers verwalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726718</guid><dc:creator><![CDATA[Jodler]]></dc:creator><pubDate>Mon, 15 Jun 2009 05:31:59 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Mon, 15 Jun 2009 13:03:42 GMT]]></title><description><![CDATA[<blockquote>
<p>GetInstance ruft keinen Konstruktor von Base oder Derived auf, sondern nur den von &quot;T&quot;, und dafür brauchts maximal einen friend in T für Singleton.</p>
</blockquote>
<p>Und T ist in unserem Fall halt nun einmal Base.<br />
Und genau deswegen ist in Base auch der friend für den Singleton.<br />
Es wird ja auch nicht in Base den Konstruktor von Singleton, sondern in Singleton den von Base aufrufen.</p>
<p>Nein. Load ist nicht die GetInstance-Methode. Die load-Methode hat mit nichts zu tun. Abgesehen davon, dass sie, da sie rein virtuell ist, verhindert, dass ResourceManager instanziert wird.</p>
<p>Wenn ich das ganze via Mehrfachvererbung implementiere, also Derived von Base und Singleton erben lasse, funktioniert es - logischerweise.<br />
Ich finde es jedoch ziemlich unangenehm, jede einzelne Klasse von Singleton ableiten zu müssen und die eigentliche Basisklasse, die ich ja, der Bequemlichkeit halber, auch gerne als Singleton hätte, kein Singleton ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726957</guid><dc:creator><![CDATA[Don Giovanni]]></dc:creator><pubDate>Mon, 15 Jun 2009 13:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Mon, 15 Jun 2009 14:44:21 GMT]]></title><description><![CDATA[<p>Naja, <code>Base</code> kann kein Singleton sein, da die Klasse abstrakt ist und dadurch keine Objekte von dieser Klasse existieren. Es wäre irgendwie unlogisch, wenn eine abstrakte Klasse ein Singleton sein könnte, nicht?<br />
Und die Vererbung bedeutet schliesslich eine <em>is-a</em> Beziehung.</p>
<p>Du wolltest dir wohl Schreibarbeit dadurch ersparen, oder? Sowas ist immer eine schlechte Idee und erst recht über eine <em>is-a</em> Beziehung.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727031</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 15 Jun 2009 14:44:21 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse erbt von Singleton - Fehler on Mon, 15 Jun 2009 17:55:41 GMT]]></title><description><![CDATA[<p>Das mit der ist-ein Beziehung ist auf jeden Fall ein richtiger Punkt.<br />
Ich wollte mir eigentlich weniger Schreibarbeit sparen, als dass ich sozusagen garantieren kann, dass jedwede Managerklasse ein Singleton ist.<br />
Aber ich werde es jetzt so lassen, ist ja kein Beinbruch, vielleicht eher sogar ein Gewinn.<br />
Jetzt habe ich auch eine schöne theoretische &quot;Begründung&quot; für die Designentscheidung. Danke Dravere <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/1727140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727140</guid><dc:creator><![CDATA[DonGiovanni]]></dc:creator><pubDate>Mon, 15 Jun 2009 17:55:41 GMT</pubDate></item></channel></rss>