<?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[Spezielle Frage zu den Möglichkeiten von C++]]></title><description><![CDATA[<p>Hallo NG,</p>
<p>Gibt es in C++ eine Möglichkeit zu verhindern, dass eine Methode mit Rückgabewert als rechte Seite einer Zuweisung verwendet wird? Klingt komisch, aber ich möchte verhindern, dass der Zeiger auf ein Objekt gespeichert wird. Der Nutzer der Klasse soll den Zeiger immer wieder durch Aufruf der Funktion abrufen und verwenden.<br />
Ich bin mir ja fast sicher, dass es nicht geht, aber bisher wurde ich in C++ immer wieder überrascht.</p>
<p>Also folgendes Szenario</p>
<pre><code>class Foo
{
public:
   static Bar* getBar(...);
};

void main()
{
   Bar* _bar = Foo::getBar(...); //verboten
   Foo::getBar(...)-&gt;freeTheWorld(); //erlaubt
}
</code></pre>
<p>Na da bin ich mal gespannt.</p>
<p>Ciao<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233017/spezielle-frage-zu-den-möglichkeiten-von-c</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 03:59:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233017.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Jan 2009 10:18:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 10:18:06 GMT]]></title><description><![CDATA[<p>Hallo NG,</p>
<p>Gibt es in C++ eine Möglichkeit zu verhindern, dass eine Methode mit Rückgabewert als rechte Seite einer Zuweisung verwendet wird? Klingt komisch, aber ich möchte verhindern, dass der Zeiger auf ein Objekt gespeichert wird. Der Nutzer der Klasse soll den Zeiger immer wieder durch Aufruf der Funktion abrufen und verwenden.<br />
Ich bin mir ja fast sicher, dass es nicht geht, aber bisher wurde ich in C++ immer wieder überrascht.</p>
<p>Also folgendes Szenario</p>
<pre><code>class Foo
{
public:
   static Bar* getBar(...);
};

void main()
{
   Bar* _bar = Foo::getBar(...); //verboten
   Foo::getBar(...)-&gt;freeTheWorld(); //erlaubt
}
</code></pre>
<p>Na da bin ich mal gespannt.</p>
<p>Ciao<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654863</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Fri, 30 Jan 2009 10:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 10:43:00 GMT]]></title><description><![CDATA[<p>Keine Ahnung, ob das geht, ist aber eigentlich auch ziemlicher unsinn IMHO.<br />
Method-chaining is einfach kacke.<br />
Einfach schon, weil ein Pointer theoretisch jederzeit gelöscht sein kann und du so wohl nicht überprüfen könntest, ob du den Aufruf überhaupt machen kannst.</p>
<p>Und Programme, die abschmieren will doch keiner :&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654878</guid><dc:creator><![CDATA[o_O]]></dc:creator><pubDate>Fri, 30 Jan 2009 10:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 10:49:42 GMT]]></title><description><![CDATA[<p>o_O schrieb:</p>
<blockquote>
<p>Keine Ahnung, ob das geht, ist aber eigentlich auch ziemlicher unsinn IMHO.</p>
</blockquote>
<p>Naja Unsinn ist etwas hart gesagt. Ich überprüfe in der Methode, ob der Aufrufer überhaupt berechtigt ist, das Objekt zu bekommen. Wenn er nun den Zeiger speichert, kann er sich dieser Prüfung nach dem 1. korrekten Aufruf entziehen, obwohl er bis dahin die Berechtigung verloren haben kann.</p>
<p>Grüße<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654883</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Fri, 30 Jan 2009 10:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 11:33:20 GMT]]></title><link>https://www.c-plusplus.net/forum/post/1654885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654885</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:33:20 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 10:54:23 GMT]]></title><description><![CDATA[<p>Du kannst ein nicht-kopierbares Objekt zurückgeben, das den Zeiger kapselt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654886</guid><dc:creator><![CDATA[wrapper]]></dc:creator><pubDate>Fri, 30 Jan 2009 10:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 11:21:39 GMT]]></title><description><![CDATA[<p>wrapper schrieb:</p>
<blockquote>
<p>Du kannst ein nicht-kopierbares Objekt zurückgeben, das den Zeiger kapselt.</p>
</blockquote>
<p>Was aber die vollständige Schnittstelle des Objektes Anbieten muss, da man sonst ebenso an den Zeiger gelangt (Effektiv ein Proxy Entwurfsmuster)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654907</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:21:39 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 11:31:57 GMT]]></title><description><![CDATA[<p>Ich denke auch, um einen Proxy kommt man nicht drumherum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654912</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 11:34:07 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Was aber die vollständige Schnittstelle des Objektes Anbieten muss, da man sonst ebenso an den Zeiger gelangt (Effektiv ein Proxy Entwurfsmuster)...</p>
</blockquote>
<p>Adressoperator verbieten. <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/1654914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654914</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 11:43:56 GMT]]></title><description><![CDATA[<p>Also das mit dem Stellvertreter finde ich schonmal gut.<br />
Mal sehen, ob sich der Aufwand lohnt. Da muss ich nochmal drüber nachdenken.</p>
<p>Wie kann ich den Adressoperator verbieten???</p>
<p>Grüße und Vielen Dank an alle die antworten!<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654923</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 11:52:47 GMT]]></title><description><![CDATA[<p>horscht2999 schrieb:</p>
<blockquote>
<p>Wie kann ich den Adressoperator verbieten???</p>
</blockquote>
<p>Das müsstest du nur machen, wenn man über den Stellvertreter (Proxy) direkt auf das Objekt zugreifen kann.</p>
<p>Also entweder man macht einen vollständigen Adapter wie von wrapper vorgeschlagen:</p>
<pre><code class="language-cpp">class Bar
{
    public:
        BarMethod1();
        BarMethod2();
};

class BarWrapper
{
    private:
        Bar* MyPtr;
    public:
        BarMethod1();  // Interface von Bar wird hier übernommen
        BarMethod2();
};
</code></pre>
<p>Oder, wenn man das Objekt direkt zurückgeben will, muss man dafür sorgen, dass man dessen Adresse nicht über den Adressoperator bekommt.</p>
<pre><code class="language-cpp">class Bar
{
    private:
        Bar* operator&amp;();  // Adressoperator privat, um Zugriff zu verhindern
    public:
        BarMethod1();
        BarMethod2();
};

class BarProxy
{
    private:
        Bar* MyPtr;
    public:
        Bar&amp; GetBar();  // Zugriff auf das Objekt dahinter. Man erfährt nie dessen Adresse.
};
</code></pre>
<p>Aber Adressoperatoren zu verbieten ist nicht unbedingt schön. Zumal es Hacks wie <code>boost::adressof</code> gibt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654931</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 30 Jan 2009 11:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 12:49:37 GMT]]></title><description><![CDATA[<p>Sag doch ma bitte, wieso du es genau brauchst<br />
um was für objekte geht es?<br />
wieso ist die prüfung erforderlich?<br />
was würde passieren, wenn er das objekt doch speichern würde?<br />
ändert sich die adresse des objektes denn?<br />
wie würde ein aufruf denn aussehen?<br />
also:</p>
<pre><code class="language-cpp">Foo::GetBar()-&gt;doA();
Foo::GetBar()-&gt;doB();
</code></pre>
<p>oder anders?<br />
etc.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654974</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 30 Jan 2009 12:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 13:13:46 GMT]]></title><description><![CDATA[<p>Also ich habe das Problem jetzt folgendermaßen gelöst:<br />
Habe ich vielleicht was übersehen. Bei meinen Tests hat der Kompiler, bei jeder Zuweisung geschimpft.</p>
<pre><code>namespace bip = boost::interprocess;

class queries_list
{
public:
    static queries_list&amp;  get_instance(const bip::sharable_lock&lt;bip::interprocess_upgradable_mutex&gt;&amp; list_lock) throw (std::invalid_argument);

    static queries_list&amp; get_instance(const bip::upgradable_lock&lt;bip::interprocess_upgradable_mutex&gt;&amp; list_lock) throw (std::invalid_argument);

    static queries_list&amp; get_instance(const bip::scoped_lock&lt;bip::interprocess_upgradable_mutex&gt;&amp; list_lock) throw (std::invalid_argument);

    static bool destroy_instance(const bip::scoped_lock&lt;bip::interprocess_upgradable_mutex&gt;&amp; list_lock, bool wait = false) throw (std::invalid_argument);

    static bip::interprocess_upgradable_mutex list_mutex;

...
 weitere nicht statische Methoden
...

private:
    queries_list();

    virtual ~queries_list();

    queries_list* operator&amp;();

    queries_list(const queries_list&amp; other);
};
</code></pre>
<p>Um die vorherige Frage zu beantworten. Das Ganze soll ein Singleton Entwurfsmuster werden, bei dem die Instanz nur zurückgegeben wird, wenn auch ein lock auf dem speziell dafür vorgesehenen mutex besteht.<br />
Würde ich das Speichern des Pointers erlauben, so könnte die Anwendung die Instanz nutzen, nachdem sie den Lock freigegeben hat.<br />
Das Ganze ist sicherlich etwas übertrieben, da man auch undefinierbares Verhalten in der Dokumentation bescheinigen könnte, wenn dieser Fall eintritt, aber wenn es doch auch programmtechnisch lösbar ist, ist mir das immer lieber, als ein Verweis auf die Doku.</p>
<p>Grüße<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654988</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Fri, 30 Jan 2009 13:13:46 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 13:20:50 GMT]]></title><description><![CDATA[<p>Wieso packst Du den Mutex nicht einfach mit in das Singleton-Objekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654994</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Jan 2009 13:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 13:30:51 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wieso packst Du den Mutex nicht einfach mit in das Singleton-Objekt?</p>
</blockquote>
<p>Weil man den Lock beantragen muss, bevor man die Instanz bekommt.<br />
(Falls das Deine Frage nicht beantwortet, habe ich sie nicht verstanden <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>Grüße<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655010</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Fri, 30 Jan 2009 13:30:51 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 13:32:38 GMT]]></title><description><![CDATA[<p>horscht2999 schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Wieso packst Du den Mutex nicht einfach mit in das Singleton-Objekt?</p>
</blockquote>
<p>Weil man den Lock beantragen muss, bevor man die Instanz bekommt.<br />
(Falls das Deine Frage nicht beantwortet, habe ich sie nicht verstanden <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>Grüße<br />
Timo</p>
</blockquote>
<p>Die als Singleton instanziierte Klasse wird doch bestimmt über irgendwelche Methoden angesprochen, oder?<br />
Ich würde eher diese Methoden threadsafe machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655013</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Jan 2009 13:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 13:34:01 GMT]]></title><description><![CDATA[<p>horscht2999 schrieb:</p>
<blockquote>
<p>Gibt es in C++ eine Möglichkeit zu verhindern, dass eine Methode mit Rückgabewert als rechte Seite einer Zuweisung verwendet wird?</p>
</blockquote>
<p>Hallo Timo,</p>
<p>ich würde den Pointer auf Bar wrappen und den Wrapper in Foo private machen - so könnte das dann gehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Bar
{
    void freeTheWorld() { std::cout &lt;&lt; &quot;irgendwas&quot; &lt;&lt; std::endl; }
};

class Foo
{
    struct BarPtr
    {
        BarPtr( Bar* p )  : m_p( p ) {}
        Bar* operator-&gt;() { return m_p; }
    private:
        BarPtr&amp; operator=( const BarPtr&amp; );
        Bar* m_p;
    };
    static Bar m_myPrivateBar;
public:
    static BarPtr getBar(/*...*/)
    {
        return BarPtr( &amp;m_myPrivateBar );
    }
};
Bar Foo::m_myPrivateBar;

int main()
{
    //Foo::BarPtr _bar = Foo::getBar(/*...*/); //verboten: cannot access private struct declared in class 'Foo'
    Foo::getBar(/*...*/)-&gt;freeTheWorld(); //erlaubt
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1655016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655016</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Fri, 30 Jan 2009 13:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 13:52:30 GMT]]></title><description><![CDATA[<p>horscht2999 schrieb:</p>
<blockquote>
<p>Das Ganze soll ein Singleton Entwurfsmuster werden, bei dem die Instanz nur zurückgegeben wird, wenn auch ein lock auf dem speziell dafür vorgesehenen mutex besteht.</p>
</blockquote>
<p>Gib ein Proxy Objekt zurück dass solange den lock hält solange es existiert.</p>
<p>dann kann ich zB den lock halten und 3 funktionen aufrufen anstatt 3mal den lock zu beantragen.</p>
<p>einzige gefahr ist, dass jemand den proxy irgendwohin kopiert und so den lock ewig hält.</p>
<p>das risiko lässt sich je nach anforderung noch reduzieren - aber generell denke ich wäre der ansatz ganz gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655039</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 30 Jan 2009 13:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Frage zu den Möglichkeiten von C++ on Fri, 30 Jan 2009 16:23:40 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Die als Singleton instanziierte Klasse wird doch bestimmt über irgendwelche Methoden angesprochen, oder?<br />
Ich würde eher diese Methoden threadsafe machen.</p>
</blockquote>
<p>Die Methoden ansich sind auch treadsafe. Aber ich muss noch verhindern, dass jemand destroy_instance() aufruft, während ein anderer thread auf die Instanz zugreift. Deshalb zusätzlich noch der Lock für die Instanz.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Gib ein Proxy Objekt zurück dass solange den lock hält solange es existiert.</p>
<p>dann kann ich zB den lock halten und 3 funktionen aufrufen anstatt 3mal den lock zu beantragen.</p>
<p>einzige gefahr ist, dass jemand den proxy irgendwohin kopiert und so den lock ewig hält.</p>
<p>das risiko lässt sich je nach anforderung noch reduzieren - aber generell denke ich wäre der ansatz ganz gut.</p>
</blockquote>
<p>Also derzeit muss der Lock nicht mehrmals angefordert werden. Es muss nur für jeden Methodenaufruf der Instanz die Instanz abgerufen werden. Den dazu nötigen lock, muss sich der thread nur einmal holen.<br />
Wichtig war mir nur, dass der thread nicht auf die Instanz zugreifen kann, wenn er den lock freigegeben hat.</p>
<p>Nochmals vielen Dank für die vielen Antworten, die ich weiß Gott nicht erwartet hätte. C++ hat mich mal wieder überzeugt, und ich werde mich wohl weiterhin mit dieser Sprache beschäftigen (zusätzlich zu dem Projekt, was gerade läuft <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>Ciao<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655102</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Fri, 30 Jan 2009 16:23:40 GMT</pubDate></item></channel></rss>