<?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[Frage zum SafeBool Idiom]]></title><description><![CDATA[<p>Hallo, ich möchte, dass meine Klasse in einer If Anweisung ausgewertet werden kann:</p>
<pre><code class="language-cpp">if(meinObjekt) //...
</code></pre>
<p>Intuitiv habe ich dafür den operator bool überladen. Jetzt habe ich aber gelesen, dass das kein guter Stil ist, da dann solche Anweisungen legal werden:</p>
<pre><code class="language-cpp">meinObjekt &lt; 15 //(meine Klasse &lt; int) wird zu (bool &lt; int) wird zu (int &lt; int)
</code></pre>
<p>Die Lösung für dieses Problem ist - laut dem Text den ich gelesen habe - das SafeBool idiom, was besagt, dass man den operator void* überladen soll. Mein Code sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt; //für NULL

class test
{
   public:
    int member;

    operator const void* const () const
    {
        return member ? static_cast&lt;const void*&gt;(*this) : NULL;
    }
};

#include &lt;iostream&gt;
int main()
{
    test a; a.member = 1;
    if(a) std::cout&lt;&lt;&quot;ja&quot;&lt;&lt;std::endl; //Programm stürzt ab
}
</code></pre>
<p>Der Code compiliert zwar, stürzt aber zur Laufzeit bei der If Anweisung ab. Kann sich jemand vorstellen, wo der Fehler liegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262457/frage-zum-safebool-idiom</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 16:13:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262457.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Mar 2010 15:48:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sat, 06 Mar 2010 15:48:15 GMT]]></title><description><![CDATA[<p>Hallo, ich möchte, dass meine Klasse in einer If Anweisung ausgewertet werden kann:</p>
<pre><code class="language-cpp">if(meinObjekt) //...
</code></pre>
<p>Intuitiv habe ich dafür den operator bool überladen. Jetzt habe ich aber gelesen, dass das kein guter Stil ist, da dann solche Anweisungen legal werden:</p>
<pre><code class="language-cpp">meinObjekt &lt; 15 //(meine Klasse &lt; int) wird zu (bool &lt; int) wird zu (int &lt; int)
</code></pre>
<p>Die Lösung für dieses Problem ist - laut dem Text den ich gelesen habe - das SafeBool idiom, was besagt, dass man den operator void* überladen soll. Mein Code sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt; //für NULL

class test
{
   public:
    int member;

    operator const void* const () const
    {
        return member ? static_cast&lt;const void*&gt;(*this) : NULL;
    }
};

#include &lt;iostream&gt;
int main()
{
    test a; a.member = 1;
    if(a) std::cout&lt;&lt;&quot;ja&quot;&lt;&lt;std::endl; //Programm stürzt ab
}
</code></pre>
<p>Der Code compiliert zwar, stürzt aber zur Laufzeit bei der If Anweisung ab. Kann sich jemand vorstellen, wo der Fehler liegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865161</guid><dc:creator><![CDATA[Safebool]]></dc:creator><pubDate>Sat, 06 Mar 2010 15:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sat, 06 Mar 2010 15:51:04 GMT]]></title><description><![CDATA[<p>*this//nöö, an den * glaub ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865164</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 06 Mar 2010 15:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sat, 06 Mar 2010 16:00:56 GMT]]></title><description><![CDATA[<p>Wie kann man nur so blind sein?<br />
Danke Volkard, das &quot;sternchen&quot; war einfach zu viel <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/1865167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865167</guid><dc:creator><![CDATA[Safebool]]></dc:creator><pubDate>Sat, 06 Mar 2010 16:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sat, 06 Mar 2010 16:13:51 GMT]]></title><description><![CDATA[<p>besser als void* soll noch ein memberpointer oder etwas in der art sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865175</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 06 Mar 2010 16:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sat, 06 Mar 2010 16:36:20 GMT]]></title><description><![CDATA[<p>Wie meinst du das, pumuckl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865182</guid><dc:creator><![CDATA[Safebool]]></dc:creator><pubDate>Sat, 06 Mar 2010 16:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sat, 06 Mar 2010 17:19:46 GMT]]></title><description><![CDATA[<p>Safebool schrieb:</p>
<blockquote>
<p>Wie meinst du das, pumuckl</p>
</blockquote>
<p>Es gibt zum Beispiel Funktionen, die void* nehmen.</p>
<pre><code class="language-cpp">test t;
FILE* fi=fopen(...);
fwrite(t,sizeof(t),1,fi);
</code></pre>
<p>Das vermeidet man mit noch verrückteren bool-Ersetzlingen als void const*, wenn man Lust hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865204</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 06 Mar 2010 17:19:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sun, 07 Mar 2010 04:58:52 GMT]]></title><description><![CDATA[<p>Das wird ja immer komplizierter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865332</guid><dc:creator><![CDATA[Safebool]]></dc:creator><pubDate>Sun, 07 Mar 2010 04:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sun, 07 Mar 2010 10:33:13 GMT]]></title><description><![CDATA[<p>Safebool schrieb:</p>
<blockquote>
<p>Das wird ja immer komplizierter.</p>
</blockquote>
<p>Am einfachsten ist es, eine normale Funktion zu verwenden, welche die Prüfung durchführt und das Resultat zurückgibt. Wieso möchtest du unbedingt auf die Funktion verzichten?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865377</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 07 Mar 2010 10:33:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum SafeBool Idiom on Sun, 07 Mar 2010 10:42:38 GMT]]></title><description><![CDATA[<p>Safebool schrieb:</p>
<blockquote>
<p>Das wird ja immer komplizierter.</p>
</blockquote>
<p>Das ist so, momentan gibt es keine wirklich schöne und einfache Möglichkeit. Im neuen C++-Standard (C++0x) werden allerdings explizite Konvertierungsoperatoren eingeführt, dann ist das Bool-Idiom wirklich safe.</p>
<p>Du musst dir auch überlegen, ob es dir das wert ist. Sind Beispiele wie <code>obj &lt; 15</code> nicht etwas gekünstelt? Ich mag zumindest mich nicht erinnern, aus Versehen mit irgendwelchen Objekten gerechnet zu haben. Und möchtest du mit den Zeiger-Workarounds sowas verbieten?</p>
<pre><code class="language-cpp">bool b = obj;
</code></pre>
<p>Aber Dravere hat Recht: Eine Funktion scheint mir im Allgemeinen am sinnvollsten. Gerade mit aussagekräftigem Funktionsnamen ist im Code auch viel ersichtlicher, was getan wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865381</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Mar 2010 10:42:38 GMT</pubDate></item></channel></rss>