<?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 Pattern und dynamisches Löschen des Objekts]]></title><description><![CDATA[<p>Hallo Leute!<br />
Ich will etwas fragen. Mein Programm benutzt das Singleton Pattern folgenderweise:</p>
<pre><code class="language-cpp">class A {
    static A* pa;
    A(){/*...*/} // unserer Konstruktor!
    A(A&amp;){} //leerer Konstruktorrumpf - brauchen wir nicht!
    A&amp; operator=(const A&amp;) {return *this;} //etwas idiotisches, aber dem Kompilator reicht es  :D brauchen wir nicht!
    static void destroy() {
        delete pa;
    }
public:
    ~A() { /*...*/
    static void create() {
        if(!pa)
            pa = new A();
    }
    static A&amp; self() {
        return *pa;
    }
    void letzteAnweisung() {
        /*...*/
        destroy();//ruft den Destruktor von A, also von *this, dieser Klase, oops, ist das OK?
    }
};

/*...*/
A* A::pa = 0;
</code></pre>
<p>Man benutzt die Klasse so:</p>
<pre><code class="language-cpp">A::create();
A::self().irgendwelche_methode_von_A();
A::self().letzteAnweisung();// danach wird das Objekt gelöscht
//A::destroy(); -&gt; nicht erlaubt wegen &quot;private&quot;. Es muss immer letzteAnweisung() durchgeführt werden, bevor A gelöscht wird.
</code></pre>
<p>Ok, das Problem: &quot;letzteAnweisung()&quot; ruft die statische Methode &quot;destroy()&quot;, die das Objekt selbst löscht. Ist das OK? Bemerken Sie, dass &quot;letzteAnweisung()&quot; eine NICHT-statische Methode ist.<br />
Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180732/problem-mit-singleton-pattern-und-dynamisches-löschen-des-objekts</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 22:34:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180732.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 May 2007 20:14:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Singleton Pattern und dynamisches Löschen des Objekts on Sat, 05 May 2007 20:14:01 GMT]]></title><description><![CDATA[<p>Hallo Leute!<br />
Ich will etwas fragen. Mein Programm benutzt das Singleton Pattern folgenderweise:</p>
<pre><code class="language-cpp">class A {
    static A* pa;
    A(){/*...*/} // unserer Konstruktor!
    A(A&amp;){} //leerer Konstruktorrumpf - brauchen wir nicht!
    A&amp; operator=(const A&amp;) {return *this;} //etwas idiotisches, aber dem Kompilator reicht es  :D brauchen wir nicht!
    static void destroy() {
        delete pa;
    }
public:
    ~A() { /*...*/
    static void create() {
        if(!pa)
            pa = new A();
    }
    static A&amp; self() {
        return *pa;
    }
    void letzteAnweisung() {
        /*...*/
        destroy();//ruft den Destruktor von A, also von *this, dieser Klase, oops, ist das OK?
    }
};

/*...*/
A* A::pa = 0;
</code></pre>
<p>Man benutzt die Klasse so:</p>
<pre><code class="language-cpp">A::create();
A::self().irgendwelche_methode_von_A();
A::self().letzteAnweisung();// danach wird das Objekt gelöscht
//A::destroy(); -&gt; nicht erlaubt wegen &quot;private&quot;. Es muss immer letzteAnweisung() durchgeführt werden, bevor A gelöscht wird.
</code></pre>
<p>Ok, das Problem: &quot;letzteAnweisung()&quot; ruft die statische Methode &quot;destroy()&quot;, die das Objekt selbst löscht. Ist das OK? Bemerken Sie, dass &quot;letzteAnweisung()&quot; eine NICHT-statische Methode ist.<br />
Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279467</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 05 May 2007 20:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton Pattern und dynamisches Löschen des Objekts on Sat, 05 May 2007 20:24:18 GMT]]></title><description><![CDATA[<p>also.<br />
erstmal deine create-methode find ich nciht gut. ein singleton muss so aussehen, als wäre es immer da. d.h. warum übernimmst du das erstellen nicht in der self-methode?</p>
<pre><code class="language-cpp">static A&amp; self() { static A a; return a; };
</code></pre>
<p>oder eben mit pointern.</p>
<p>Das löschen von singletons am programmende ist immer ein bisschen trickreich. Ich hab bis jetzt noch keine lösung gefunden, das automatisch geschehen zu lassen. Warum muss man denn letzteAnweisung aufrufen und darf nich einfach Destroy aufrufen? In Destroy können ja dann auch noch aufräumarbeiten gemacht werden, die in letzteAnweisung gemacht wurden.</p>
<p>zur Frage: ja es ist OK, wenn eine nicht-statische methode eine statische methode aufruft. ANdersrum geht es nicht. Da du aber eh ein singleton hast, kann man quasi alle methdoen als statisch ansehen (nur bildliche gesehen) weil es ja eh nur eine instanz von der klasse gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279475</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 05 May 2007 20:24:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton Pattern und dynamisches Löschen des Objekts on Sat, 05 May 2007 20:33:41 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>also.<br />
erstmal deine create-methode find ich nciht gut. ein singleton muss so aussehen, als wäre es immer da. d.h. warum übernimmst du das erstellen nicht in der self-methode?</p>
<pre><code class="language-cpp">static A&amp; self() { static A a; return a; };
</code></pre>
<p>oder eben mit pointern.</p>
</blockquote>
<p>Weil ich schon eine Menge von Parametern auf A Konstruktor übergeben muss. Kann ich self() überladen, so dass es 2 Versionen gibt:<br />
* mit Parametern - wird A generiert<br />
* ohne Parametern - wird die Instanz von A geliefert.<br />
Im zweiten Fall würde ich A&amp; zurückliefern, weil -&gt; mir zu schwer zu schreiben ist.<br />
destroy() soll nie vom Benutzer frei aufgerufen werden, denn es ist sinnlos. Zusätzlich kann es sein, dass er es vergisst 1 mal aufzurufen.<br />
Meine Lösung - destroy() in eine wichtige Methode einfügen, so dass es sicher ist, das Objekt wird GENAU 1 Mal gelöscht. OK?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279479</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 05 May 2007 20:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton Pattern und dynamisches Löschen des Objekts on Sat, 05 May 2007 20:52:28 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class A {
    static A* pa;
    A(){/*...*/} // unserer Konstruktor!
    A(const A&amp;); // Konst muss da rein. Es reicht auch eine Deklaration.
    A&amp; operator=(const A&amp;); // Hier genauso

    static void destroy() {
        delete pa;
    }

    ~A() {} // Destruktor ebenfalls privat
public:´
    static A&amp; self() {
        if(!pa){
            pa = new A();
            // Eine mehr oder weniger gute möglichkeit:
            atexit(destroy);
        }
        return *pa; // Wie schon andere angemerkt haben, ist das besser.
           // Die statische Variante ist aber nicht thread-safe.
           // Und hat paar andere &quot;Effekte&quot; die nicht unbedigt gut sein müssen
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279484</guid><dc:creator><![CDATA[matimatiker]]></dc:creator><pubDate>Sat, 05 May 2007 20:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton Pattern und dynamisches Löschen des Objekts on Sun, 06 May 2007 04:09:37 GMT]]></title><description><![CDATA[<p><a href="http://www.oop-trainer.de/Themen/Singleton.html" rel="nofollow">http://www.oop-trainer.de/Themen/Singleton.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279525</guid><dc:creator><![CDATA[Dazed And Confused]]></dc:creator><pubDate>Sun, 06 May 2007 04:09:37 GMT</pubDate></item></channel></rss>