<?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 - mit allg. Konstruktor?]]></title><description><![CDATA[<p>Ich mach's kurz: Gegeben sei folgendes Singleton-Pattern:</p>
<pre><code class="language-cpp">class A
{
    private:
        X&amp; m_x;
    public:
        A(X&amp; x) :m_x(x) {}
};

class Singleton : public A
{
    private:
        Singleton() {}
        Singleton(const Singleton&amp;);
        Singleton&amp; operator=(const Singleton&amp;);
    public:
        ~Singleton() {}
        static Singleton&amp; getInstance()
        {
            static Singleton s;
            return s;
        }
};
</code></pre>
<p>Soweit so gut. Mein Problem: Die Klasse A enthält als Member eine Referenz.<br />
Referenzen müssen aber gleich initialisiert werden.<br />
Der Default-Konstruktor von Singleton ruft zunächst den Default-Konstruktor von A auf. Und da beschwert sich der Compiler &quot;uninitialized reference m_x&quot;.</p>
<p>Meine Idee war:<br />
Ich muss also in Singleton den allgemeinen Konstruktor von A erzwingen, deshalb habe ich folgendes probiert:</p>
<pre><code class="language-cpp">class Singleton : public A

{
    private:
        Singleton(X&amp; x) :A(x) {}
        Singleton(const Singleton&amp;);
        Singleton&amp; operator=(const Singleton&amp;);
        static Singleton m_s;
    public:
        ~TestS() {}
        static void createSingleton(X&amp; x)
        {
            Singleton s(x);
            m_s = s;
        }
        static Singleton&amp; getInstance()
        {
            return m_s;
        }
};
</code></pre>
<p>Dann wiederum gibt es einen Link-Fehler:</p>
<p>[Link error] undefined reference m_s</p>
<p>Wie ist die Lösung für dieses Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/159088/singleton-mit-allg-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 08:08:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/159088.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Sep 2006 21:33:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Mon, 11 Sep 2006 21:33:09 GMT]]></title><description><![CDATA[<p>Ich mach's kurz: Gegeben sei folgendes Singleton-Pattern:</p>
<pre><code class="language-cpp">class A
{
    private:
        X&amp; m_x;
    public:
        A(X&amp; x) :m_x(x) {}
};

class Singleton : public A
{
    private:
        Singleton() {}
        Singleton(const Singleton&amp;);
        Singleton&amp; operator=(const Singleton&amp;);
    public:
        ~Singleton() {}
        static Singleton&amp; getInstance()
        {
            static Singleton s;
            return s;
        }
};
</code></pre>
<p>Soweit so gut. Mein Problem: Die Klasse A enthält als Member eine Referenz.<br />
Referenzen müssen aber gleich initialisiert werden.<br />
Der Default-Konstruktor von Singleton ruft zunächst den Default-Konstruktor von A auf. Und da beschwert sich der Compiler &quot;uninitialized reference m_x&quot;.</p>
<p>Meine Idee war:<br />
Ich muss also in Singleton den allgemeinen Konstruktor von A erzwingen, deshalb habe ich folgendes probiert:</p>
<pre><code class="language-cpp">class Singleton : public A

{
    private:
        Singleton(X&amp; x) :A(x) {}
        Singleton(const Singleton&amp;);
        Singleton&amp; operator=(const Singleton&amp;);
        static Singleton m_s;
    public:
        ~TestS() {}
        static void createSingleton(X&amp; x)
        {
            Singleton s(x);
            m_s = s;
        }
        static Singleton&amp; getInstance()
        {
            return m_s;
        }
};
</code></pre>
<p>Dann wiederum gibt es einen Link-Fehler:</p>
<p>[Link error] undefined reference m_s</p>
<p>Wie ist die Lösung für dieses Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1135513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1135513</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Mon, 11 Sep 2006 21:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Mon, 11 Sep 2006 22:04:40 GMT]]></title><description><![CDATA[<p>Dir fehlt ein:</p>
<pre><code class="language-cpp">Singleton Singleton::m_s;
</code></pre>
<p>in der Implementationsdatei. Das nützt dir allerdings überhaupt nicht, weil der relevante Konstruktor nicht existiert. Zumindest das klassische Singleton-Pattern ist ungeeignet, wenn bei der Konstruktion Argumente übergeben werden müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1135523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1135523</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Mon, 11 Sep 2006 22:04:40 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Mon, 11 Sep 2006 22:21:47 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>Zumindest das klassische Singleton-Pattern ist ungeeignet, wenn bei der Konstruktion Argumente übergeben werden müssen.</p>
</blockquote>
<p>Gibt es Alternativen?</p>
<p>Ich bin nicht zu sehr auf das Singleton-Pattern verbissen. Mir geht darum, dass ich an meheren Stellen im Code auf eine Instanz (immer die gleiche) der Klasse Singleton zugreifen muss. Diese sollte möglichst zentral gehalten werden, so dass nicht zuviel Abhängigkeiten entstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1135528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1135528</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Mon, 11 Sep 2006 22:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 06:41:53 GMT]]></title><description><![CDATA[<p>Wenn du dich darauf einlassen willst, das Objekt manuell anzulegen und wieder zu löschen:</p>
<pre><code class="language-cpp">class foo
{
        static foo *s_This;

    private:

        foo (const foo&amp;);

    public:

        foo (irgendwelche argumente);
        ~foo();

        static foo&amp; Get();
};
</code></pre>
<pre><code class="language-cpp">foo foo::s_This = 0;

foo::foo (irgendwelche argumente)
{
    if (s_This)
        throw std::runtime_error (&quot;only once instance of foo allowed&quot;);

    s_This = this;
}

foo::~foo()
{
    s_This = 0;
}

foo foo::Get()
{
    if (!s_This)
        throw std::runtime_error (&quot;no instance of foo&quot;);

    return *s_This;
}
</code></pre>
<p>Ungetestet, leicht vereinfacht und an einigen Stellen mehr Pseudo-Code als C++. Aber ich denke, das Prinzip sollte klar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1135573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1135573</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Tue, 12 Sep 2006 06:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 16:22:37 GMT]]></title><description><![CDATA[<p>Nicht ganz.</p>
<p>Wie willst du im Konstruktor das &quot;this&quot; erzeugen?</p>
<pre><code class="language-cpp">foo::foo (irgendwelche argumente)
{
    if (s_This)
        throw std::runtime_error (&quot;only once instance of foo allowed&quot;);

    s_This = this;
}
</code></pre>
<p>Wohlgemerkt - die Singleton erbt von einer Klasse, für die der allg. Konstruktor aufgerufen werden muss.</p>
<p>Und wie meinst du das:</p>
<pre><code class="language-cpp">foo foo::s_This = 0;
</code></pre>
<p>Eine Zuweisung mit einem Rückgabewert? <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>
<p>Ok, du willst den Zeiger anfangs eben auf 0 setzen, aber das &quot;Wie&quot; und &quot;Wo&quot; du das machst kann ich nicht ganz nachvollziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1136021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1136021</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Tue, 12 Sep 2006 16:22:37 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 16:36:41 GMT]]></title><description><![CDATA[<p>sly schrieb:</p>
<blockquote>
<p>Nicht ganz.</p>
<p>Wie willst du im Konstruktor das &quot;this&quot; erzeugen?</p>
</blockquote>
<p>this ist ein Zeiger auf das Objekt, in dem du dich gerade befindet. Das muß nicht extra erzeugt werden.</p>
<p>sly schrieb:</p>
<blockquote>
<p>Wohlgemerkt - die Singleton erbt von einer Klasse, für die der allg. Konstruktor aufgerufen werden muss.</p>
</blockquote>
<p>Mit &quot;allg. Konstruktor&quot; meinst du irgendeinen Konstruktor der Argumente übergeben bekommt, ja? Wo ist dann das Problem?</p>
<p>sly schrieb:</p>
<blockquote>
<p>Und wie meinst du das:</p>
<pre><code class="language-cpp">foo foo::s_This = 0;
</code></pre>
</blockquote>
<p>Das ist eine statische Member-Variable, siehe auch Klasse foo (da steht sie noch mal drin). Fehlt nur leider ein *, Sorry! Richtig sieht es so aus:</p>
<pre><code class="language-cpp">foo *foo::s_This = 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1136032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1136032</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Tue, 12 Sep 2006 16:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 17:06:23 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ist eine statische Member-Variable, siehe auch Klasse foo (da steht sie noch mal drin)</p>
<pre><code class="language-cpp">foo *foo::s_This = 0;
</code></pre>
</blockquote>
<p>Ok, verstanden. Ich kannte bisher diese Syntax für statische Membervariablen noch nicht, deshalb meine Verwirrung. <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>
<p>Den Konstruktor versteh ich trotzdem noch nicht. Sorry wenn ich nochmal nachhaken muss:</p>
<p>Das Bedeutung von &quot;this&quot; kenne ich, jedoch bisher nur in Methoden. Und da bezeichnet es einen Zeiger auf das aufrufende Objekt.</p>
<p>In einem Konstruktor ist this jedoch ein Zeiger auf ein Objekt, das gerade erzeugt wird...und wie wurstle ich jetzt da den Parameteraufruf für den Konstruktor rein?</p>
<p>Mein Ziel ist es ja, den Konstruktor auf die Art wie:</p>
<p>Foo f(irgendwelche Argumente);</p>
<p>aufrzurufen.</p>
<p>Aber ich kann doch in einem Konstruktor den Konstruktor nicht slebst wieder rekursiv aufrufen -&gt; Verwirrung pur.</p>
<p>Ich steh auf'm Schlauch, wäre nett wenn du den Konstruktor vollständig implementierst (denn da fehlt ja noch was nehm ich an...?)</p>
<pre><code class="language-cpp">foo::foo (irgendwelche argumente)
{
    if (s_This)
        throw std::runtime_error (&quot;only once instance of foo allowed&quot;);

    s_This = this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1136049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1136049</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Tue, 12 Sep 2006 17:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 17:15:14 GMT]]></title><description><![CDATA[<p>Der Konstruktor ist vollständig, abgesehen von der initialisierung der Basisklasse</p>
<pre><code class="language-cpp">: basisklasse (irgendwelche argumente)
</code></pre>
<p>Vielleicht sollte ich dir lieber mal ein Anwendungsbeispiel geben.</p>
<p>Du kannst dein foo-Objekt zum Beispiel in der main anlegen:</p>
<pre><code class="language-cpp">int main()
{
    // irgendwas

    foo Foo (irgendwelche argumente);

    // irgendwas2
}
</code></pre>
<p>Von dem Zeitpunkt an, an dem Foo konstruiert worden ist, kannst du somit überall mittels foo:Get() auf diese Instanz zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1136054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1136054</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Tue, 12 Sep 2006 17:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 17:16:20 GMT]]></title><description><![CDATA[<p>Ok ok ok...ich glaub der Groschen ist gefallen: im Konstruktor fehlt nur ein:</p>
<p>foo::foo (irgendwelche argumente) :BasisKlasse(irgendwelche Argumente)<br />
{<br />
....<br />
}</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<p>Jedenfalls funktioniert es jetzt so...sag mir bitte jetzt nicht, dass das falsch ist. <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/1136055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1136055</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Tue, 12 Sep 2006 17:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton - mit allg. Konstruktor? on Tue, 12 Sep 2006 17:17:18 GMT]]></title><description><![CDATA[<p>Zeitgleich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1136056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1136056</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Tue, 12 Sep 2006 17:17:18 GMT</pubDate></item></channel></rss>