<?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[casten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine allgemeine Frage zum Thema casten. In meinem Buch (C++ für Spieleprogrammierer) kam das in Kapitel 2 vor (bin mittlerweile ungf. in der Mitte des Buches). Nun ist aber das Problem, dass ich irgendwie diesen Text im Buch über Casten nicht kapiere. Ich weiß wie man das schreibt <code>static_cast&lt;int&gt; (number1-number2)</code> zB.</p>
<p>Aber warum ist casten gut?!<br />
Wann würde man soetwas in einem Programm gebrauchen?</p>
<p>Danke im Voraus für Aufklärungen <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=";D"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280462/casten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 02:04:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280462.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 Jan 2011 08:32:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to casten on Sun, 16 Jan 2011 08:32:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine allgemeine Frage zum Thema casten. In meinem Buch (C++ für Spieleprogrammierer) kam das in Kapitel 2 vor (bin mittlerweile ungf. in der Mitte des Buches). Nun ist aber das Problem, dass ich irgendwie diesen Text im Buch über Casten nicht kapiere. Ich weiß wie man das schreibt <code>static_cast&lt;int&gt; (number1-number2)</code> zB.</p>
<p>Aber warum ist casten gut?!<br />
Wann würde man soetwas in einem Programm gebrauchen?</p>
<p>Danke im Voraus für Aufklärungen <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=";D"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007150</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sun, 16 Jan 2011 08:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Sun, 16 Jan 2011 09:59:40 GMT]]></title><description><![CDATA[<p>Um dem Compiler klar zu machen, dass man wirklich einen Typkonvertierung will:</p>
<pre><code class="language-cpp">float f = 10.5;
int i = f; // Warnung bzw. Fehler da Nachkommastellen verloren gehen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2007173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007173</guid><dc:creator><![CDATA[dfgdfg]]></dc:creator><pubDate>Sun, 16 Jan 2011 09:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Sun, 16 Jan 2011 10:32:25 GMT]]></title><description><![CDATA[<p>oder char in int:</p>
<pre><code class="language-cpp">char a = 'a';
int i = static_cast&lt;int&gt; (a); //i=97 (dezimal) (hexadez. = 61)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2007190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007190</guid><dc:creator><![CDATA[Gucky]]></dc:creator><pubDate>Sun, 16 Jan 2011 10:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Sun, 16 Jan 2011 10:41:59 GMT]]></title><description><![CDATA[<p>Ein gutes Beispiel sind C-Funktionen, die Userdaten als void-pointer zulassen, in z.Bsp. Callbacks:</p>
<pre><code class="language-cpp">class Foo
{
    void bar() 
    {
       c_lib_method(my_callback, this);
    }

    void log(const char* msg)
    {
        std::cout &lt;&lt; msg &lt;&lt; std::endl;
    }
};

void my_callback(int a, void* userdata)
{
   Foo* f = dynamic_cast&lt;Foo*&gt;(userdata);
   f-&gt;log(&quot;blabla&quot;);
}
</code></pre>
<p>Die Funktion c_lib_method würde jetzt jedesmal wenn sie my_callback aufruft den this-Zeiger von Foo mit übergeben und man kann auf diese Klasse zugreifen.<br />
Nur ein weiteres Szenario. Mit C++ sollte man solche Callbacks natürlich nicht mehr erzeugen, da kann man Basisklassen etc verwenden für.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007196</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sun, 16 Jan 2011 10:41:59 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Sun, 16 Jan 2011 11:07:47 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Foo
{
    void bar() 
    {
       c_lib_method(my_callback, this);
    }
   
    void log(const char* msg)
    {
        std::cout &lt;&lt; msg &lt;&lt; std::endl;
    }
};

void my_callback(int a, void* userdata)
{
   Foo* f = dynamic_cast&lt;Foo*&gt;(userdata);
   f-&gt;log(&quot;blabla&quot;);
}
</code></pre>
</blockquote>
<p>Einen dynamic_cast mit void* sollte der Compiler aber zurückweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007207</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 16 Jan 2011 11:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Sun, 16 Jan 2011 11:37:14 GMT]]></title><description><![CDATA[<p>Stimmt, muss ein static_Cast sein. Naja war früh <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007218</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sun, 16 Jan 2011 11:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 00:00:44 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Da C/C++ eine explicite Typenkonvention nutzt, muss dem Compiler klar gemacht<br />
werden, wie das Datensegment <strong>explecit</strong> zur Laufzeit behandelt werden soll.</p>
<p>Bei ptrs auf Objecte oder Basistypen reichen also C-Casts des alten Stils.<br />
(Es gibt eigentlich keinen vernünftigen grund dyn_casts&lt;&gt; oder static casts&lt;&gt;<br />
den C_Casts vorzuziehen, ausser das diese in der IDE gehighlighted werden..<br />
siehe <a href="http://www.aristeia.com/EC3E/3E_item27.pdf" rel="nofollow">http://www.aristeia.com/EC3E/3E_item27.pdf</a>)</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007515</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 00:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 00:13:03 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Es gibt eigentlich keinen vernünftigen grund dyn_casts&lt;&gt; oder static casts&lt;&gt;<br />
den C_Casts vorzuziehen, ausser das diese in der IDE gehighlighted werden..<br />
siehe <a href="http://www.aristeia.com/EC3E/3E_item27.pdf" rel="nofollow">http://www.aristeia.com/EC3E/3E_item27.pdf</a></p>
</blockquote>
<p>Lies bitte deinen eigenen Link.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007516</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 17 Jan 2011 00:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 00:23:52 GMT]]></title><description><![CDATA[<p>Habe ich doch <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>
<blockquote>
<p>Prefer C++-style casts to old-style casts. They are easier to see, and<br />
they are more specific about what they do.</p>
</blockquote>
<p>Das ist der einzige grund diese zu nutzen, und für mich kein vernünftiger da<br />
mir das Kompilierverhalten bekannt ist.</p>
<p>Ist doch genau was ich in meinen vorherigen post geschrieben habe oder nicht?</p>
<p>greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007518</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 00:23:52 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 00:35:38 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Das ist der einzige grund diese zu nutzen, und für mich kein vernünftiger da<br />
mir das Kompilierverhalten bekannt ist.</p>
</blockquote>
<p>Be precise<br />
ist einer der wichtigsten Punkte beim Programmieren.</p>
<p>Deshalb: c++ style casts vorziehen.</p>
<p>PS:<br />
wenn du das anders siehst, dann lies den Link noch ein paar mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007519</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 17 Jan 2011 00:35:38 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 00:55:08 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Scorcher24 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Foo
{
    void bar() 
    {
       c_lib_method(my_callback, this);
    }
   
    void log(const char* msg)
    {
        std::cout &lt;&lt; msg &lt;&lt; std::endl;
    }
};

void my_callback(int a, void* userdata)
{
   Foo* f = dynamic_cast&lt;Foo*&gt;(userdata);
   f-&gt;log(&quot;blabla&quot;);
}
</code></pre>
</blockquote>
<p>Einen dynamic_cast mit void* sollte der Compiler aber zurückweisen.</p>
</blockquote>
<p>In dieser Richtung: ja.<br />
In der anderen ist es lustigerweise erlaubt (also void* als Target).<br />
Dann bekommt man einen Zeiger auf die &quot;most derived class&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007522</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 00:55:08 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 01:39:17 GMT]]></title><description><![CDATA[<p>Hi,..</p>
<p>Be Precise</p>
<p>Ja, genau das mache ich ja. Ich sage explicit und precise wie der compiler<br />
ein datensegment zu behandeln hat. Und stellt euch vor: Das mit C_Casts!</p>
<p>Die this ptr adjustage im casting von multiblen derivaten muss<br />
selbstverständlich berücksichtigt werden.</p>
<p>Gehen wir doch mal das Dokument gemeinsam durch:</p>
<p>Zuerst das wichtigste,...</p>
<blockquote>
<p>...But note that I said that an offset is “sometimes” required. The way<br />
objects are laid out and the way their addresses are calculated varies<br />
from compiler to compiler. That means that just because your “I know<br />
how things are laid out” casts work on one platform doesn’t mean<br />
they’ll work on others. The world is filled with woeful programmers<br />
who’ve learned this lesson the hard way.</p>
</blockquote>
<p>gucken wir uns doch mal das beispiel an:</p>
<pre><code class="language-cpp">class SpecialWindow: public Window { // derived class
public:
virtual void onResize() { // derived onResize impl;
static_cast&lt;Window&gt;(*this).onResize(); // cast *this to Window,
// then call its onResize;
// this doesn’t work!
... // do SpecialWindow-
} // specific stuff
...
};
</code></pre>
<p>Funktioniert net, also ohne C++ style cast....</p>
<pre><code class="language-cpp">class SpecialWindow: public Window { // derived class
public:
virtual void onResize() { // derived onResize impl;
Window::onResize(); 
... // do SpecialWindow-
} // specific stuff
...
};
</code></pre>
<p>Und ein weiters beispiel:</p>
<pre><code class="language-cpp">class Window { ... };
class SpecialWindow: public Window {
public:
void blink();
...
};
typedef // see Item 13 for info
std::vector&lt;std::tr1::shared_ptr&lt;Window&gt; &gt; VPW; // on tr1::shared_ptr
VPW winPtrs;
...
for (VPW::iterator iter = winPtrs.begin(); // undesirable code:
iter != winPtrs.end(); // uses dynamic_cast
++iter) {
if (SpecialWindow *psw = dynamic_cast&lt;SpecialWindow*&gt;(iter-&gt;get()))
psw-&gt;blink();
}
</code></pre>
<p>Das gleiche für dynamic_cast bei der blink member fkt, braucht man nicht, dafür hat man die polymorphie,..</p>
<pre><code class="language-cpp">class Window {
public:
virtual void blink() {} // default impl is no-op;
... // see Item 34 for why
}; // a default impl may be
// a bad idea
class SpecialWindow: public Window {
public:
virtual void blink() { ... }; // in this class, blink
... // does something
};
typedef std::vector&lt;std::tr1::shared_ptr&lt;Window&gt; &gt; VPW;
VPW winPtrs; // container holds
// (ptrs to) all possible
... // Window types
for (VPW::iterator iter = winPtrs.begin();
iter != winPtrs.end();
++iter) // note lack of
(*iter)-&gt;blink(); // dynamic_cast
</code></pre>
<p>Weil es so schön war, gucken wir uns nochmal seine aussage über die performance an:</p>
<blockquote>
<p>For example, at least one common implementation is based in<br />
part on string comparisons of class names. If you’re performing a<br />
dynamic_cast on an object in a single-inheritance hierarchy four levels<br />
deep, each dynamic_cast under such an implementation could cost you<br />
up to four calls to strcmp to compare class names. A deeper hierarchy<br />
or one using multiple inheritance would be more expensive.</p>
</blockquote>
<p>Diskutieren wir doch mal gemeinsam die C++ Cast types</p>
<blockquote>
<p>■ const_cast is typically used to cast away the constness of objects. It<br />
is the only C++-style cast that can do this.<br />
■ dynamic_cast is primarily used to perform “safe downcasting,” i.e.,<br />
to determine whether an object is of a particular type in an inheritance<br />
hierarchy. It is the only cast that cannot be performed using<br />
the old-style syntax. It is also the only cast that may have a<br />
significant runtime cost. (I’ll provide details on this a bit later.)<br />
■ reinterpret_cast is intended for low-level casts that yield implementation-<br />
dependent (i.e., unportable) results, e.g., casting a pointer<br />
to an int. Such casts should be rare outside low-level code. I use it<br />
only once in this book, and that’s only when discussing how you<br />
might write a debugging allocator for raw memory (see Item 50).<br />
■ static_cast can be used to force implicit conversions (e.g., non-const<br />
object to const object (as in Item 3), int to double, etc.). It can also be<br />
used to perform the reverse of many such conversions (e.g., void*<br />
pointers to typed pointers, pointer-to-base to pointer-to-derived),<br />
though it cannot cast from const to non-const objects. (Only<br />
const_cast can do that.)</p>
</blockquote>
<p><code>const_cast</code> const Ist nur für den zu kompilierenden kontext<br />
(strucktur konsistenz und lebenzeitprüfung zur kompilierzeit) und nicht für<br />
die ausführung des Sources relevant. (Einfach mal assembly anschauen)<br />
D.h. verwendet man ein const_cast so hat man einen struckturellen fehler in der<br />
Deklaration oder Definition.</p>
<p><code>dynamic_cast</code> Weg damit,wozu gibt es polymorphie,...</p>
<p><code>reinterpret_cast</code><br />
A) Wozu gibt es Casting member Operatoren<br />
und <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> (MSDN) The reinterpret_cast allows the pointer to be treated as an<br />
integral type. The result is then bit-shifted and XORed with itself to produce<br />
a unique index (unique to a high degree of probability). The index is then<br />
truncated by a standard C-style cast to the return type of the function.</p>
<p><code>static_cast</code><br />
(MSDN) Consequently, static_cast can do the inverse of implicit conversions, in<br />
which case the results are undefined. It is left to the programmer to verify<br />
that the results of a static_cast conversion are safe.</p>
<p>This behavior also applies to types other than class types. For instance,<br />
static_cast can be used to convert from an int to a char. However, the<br />
resulting char may not have enough bits to hold the entire int value. Again, it<br />
is left to the programmer to verify that the results of a static_cast<br />
conversion are safe.<br />
-- So, und was ist der unterschied zum C_Cast ???</p>
<p>Wie ich gesagt habe: Der maintance unterschied ist das highlighting.<br />
Man darf aber ie vergessen das alignment der Objecte bei den Casts zu prüfen.</p>
<p>Mal gucken wem ich jetzt wieder auf den Schlipps getreten bin <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>
<p>Freu mich auf response <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/2007524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007524</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 01:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 09:08:47 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Be Precise</p>
<p>Ja, genau das mache ich ja. Ich sage explicit und precise wie der compiler<br />
ein datensegment zu behandeln hat. Und stellt euch vor: Das mit C_Casts!</p>
</blockquote>
<p>Das tust Du nicht. Denn die <em>Bedeutung</em> eines C-style Cast ist <em>abhängig vom Kontext</em>. Je nach Kontext kann es ein static_cast, const_cast, reinterpret_cast, etc etc etc oder sogar eine Kombination daraus sein. Das gefährliche daran ist, dass es kompilieren kann und etwas anderes macht, als das, was der Programmierer sich dabei gedacht hat. Mit den C++-style Casts hast Du die Möglichkeit, genau das auszudrücken, was Du wilclst. Wenn Du beispielsweise einen static_cast brauchst, aber einen C-style Cast benutzt und versehentlich das const entfernst, kann Dir der Compiler das nicht als Fehler anstreichen. Ein C-style Cast ist die &quot;Ich konvertiere alles irgendwie&quot;-Brechhammer-Methode, die evnetuell Dinge tut, die Du nicht willst und die mit C++-style-Casts abgefangen werden können, weil sie jeweils restriktiver sind.</p>
<p>Und so in etwa steht das auch in Deinem zitierten Link!</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>Die this ptr adjustage im casting von multiblen derivaten muss<br />
selbstverständlich berücksichtigt werden.</p>
<p>Gehen wir doch mal das Dokument gemeinsam durch:</p>
<p>Zuerst das wichtigste,...</p>
<blockquote>
<p>...But note that I said that an offset is “sometimes” required. The way<br />
objects are laid out and the way their addresses are calculated varies<br />
from compiler to compiler. That means that just because your “I know<br />
how things are laid out” casts work on one platform doesn’t mean<br />
they’ll work on others. The world is filled with woeful programmers<br />
who’ve learned this lesson the hard way.</p>
</blockquote>
</blockquote>
<p>Mit anderen Worten: reinterpret_cast (oder ein C-style Cast der einen reinterpret_cast enthält, obwohl man ihm es nicht ansehen kann) ist gefährlich.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>gucken wir uns doch mal das beispiel an:</p>
<pre><code class="language-cpp">class SpecialWindow: public Window { // derived class
public:
virtual void onResize() { // derived onResize impl;
static_cast&lt;Window&gt;(*this).onResize(); // cast *this to Window,
// then call its onResize;
// this doesn’t work!
... // do SpecialWindow-
} // specific stuff
...
};
</code></pre>
<p>Funktioniert net, also ohne C++ style cast....</p>
</blockquote>
<p>Dieser cast erzeugt ein neues Window-Objekt per Slicing. Wenn es das ist, was Du willst, dann ist es natürlich richtig. Ansonsten, hättest Du auch noch hinter Window ein &amp; setzen können, um das Subobjekt von *this zu adressieren. Ziehe in Betracht, dass Du C++-style Casts nicht verstanden haben könntest.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>Und ein weiters beispiel:</p>
<pre><code class="language-cpp">class Window { ... };
class SpecialWindow: public Window {
public:
void blink();
...
};
typedef // see Item 13 for info
std::vector&lt;std::tr1::shared_ptr&lt;Window&gt; &gt; VPW; // on tr1::shared_ptr
VPW winPtrs;
...
for (VPW::iterator iter = winPtrs.begin(); // undesirable code:
iter != winPtrs.end(); // uses dynamic_cast
++iter) {
if (SpecialWindow *psw = dynamic_cast&lt;SpecialWindow*&gt;(iter-&gt;get()))
psw-&gt;blink();
}
</code></pre>
</blockquote>
<p>Das Beispiel hat nichts mit &quot;C++ style&quot; vs &quot;C style&quot; cast zu tun. Es ist höchstens ein Beispiel für schlechtes Design.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>Diskutieren wir doch mal gemeinsam die C++ Cast types</p>
<p><code>const_cast</code> const Ist nur für den zu kompilierenden kontext<br />
(strucktur konsistenz und lebenzeitprüfung zur kompilierzeit) und nicht für<br />
die ausführung des Sources relevant. (Einfach mal assembly anschauen)<br />
D.h. verwendet man ein const_cast so hat man einen struckturellen fehler in der<br />
Deklaration oder Definition.</p>
</blockquote>
<p>Wie Du zu dieser Schlussfolgerung kommst ist mir nicht klar.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p><code>dynamic_cast</code> Weg damit,wozu gibt es polymorphie,...</p>
</blockquote>
<p>dynamic_cast ist ein Werkzeug. Wenn Du es brauchst, benutze es. Wenn nicht, dann nicht. Ich stimme Dir zu, dass es in einigen Fällen missbraucht wird. Aber das gilt eigentlich für alles andere auch.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p><code>reinterpret_cast</code><br />
A) Wozu gibt es Casting member Operatoren<br />
und <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> (MSDN) The reinterpret_cast allows the pointer to be treated as an<br />
integral type. The result is then bit-shifted and XORed with itself to produce<br />
a unique index (unique to a high degree of probability). The index is then<br />
truncated by a standard C-style cast to the return type of the function.</p>
</blockquote>
<p>Dein Punkt A ergibt keinen Sinn, Punkt B sieht aus wie ein aus dem Zusammenhang gerissenes Zitat.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p><code>static_cast</code><br />
(MSDN) Consequently, static_cast can do the inverse of implicit conversions, in<br />
which case the results are undefined. It is left to the programmer to verify<br />
that the results of a static_cast conversion are safe.</p>
<p>This behavior also applies to types other than class types. For instance,<br />
static_cast can be used to convert from an int to a char. However, the<br />
resulting char may not have enough bits to hold the entire int value. Again, it<br />
is left to the programmer to verify that the results of a static_cast<br />
conversion are safe.</p>
<p>-- So, und was ist der unterschied zum C_Cast ???</p>
</blockquote>
<p>Das wurde doch schon mehrfach erklärt. Es beschränt sich nicht nur auf Syntax-Highlighting.</p>
<p>Nochmal:<br />
Ein C-style Cast ist je nach Kontext entweder ein dynamic_cast, static_cast, const_cast, reinterpret_cast oder eine Kombination davon. Wenn Du eine bestimmte Operation wünscht, dann hast Du mit einem C++-style Cast die Gelegenheit genau zu sagen, was Du willst. Damit kannst Du Fehler schon zur Compile-Zeit ausschließen. Zeige mir ein Beispiel wo Du ein C-style Cast für angebracht hältst und ich sage Dir, welchen Cast Du eigentlich damit machen wolltest, und wie Du das explizit mit einem C++-style Cast ausdrücken kannst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007572</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 17 Jan 2011 09:08:47 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 11:35:20 GMT]]></title><description><![CDATA[<p>Jo krümmelkacker, (cooler name <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>
<p>Mahlzeit erstmal....<br />
Also, die geposteten Sources sind aus dem Link und nicht von mir,<br />
welche die falsche handhabung von casts und insbesondere von C++ Style Casts<br />
verdeutlichen sollen!</p>
<p>Das Ziel meiner Argumentation ist, die Aussage verständlich zu machen:<br />
<strong>&quot;Es reicht C_Cast zu benützen!&quot;</strong><br />
(Ich habe nicht gesagt: macht das alle so, sonst gibt auf die nuss <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>
<p>Meine Argumentation basiert darauf, dass 50% der C++ Style Casts unnütz,<br />
und die anderen beiden so oder so auf C_Casts (oder Casting memberfkt's )<br />
zurück zu führen sind.</p>
<p>Gehen wir mal auf den direkten vergleich von C_Cast und C++ Cast aus dem link ein:</p>
<blockquote>
<p>The old-style casts continue to be legal, but the new forms are preferable.<br />
First, they’re much easier to identify in code (both for humans<br />
and for tools like grep), thus simplifying the process of finding places<br />
in the code where the type system is being subverted. Second, the<br />
more narrowly specified purpose of each cast makes it possible for<br />
compilers to diagnose usage errors.</p>
</blockquote>
<p>A) Wenn ich nicht erkenne, wo das explicite typensystem unterlaufen wird, ist:<br />
I) Der Source schlecht dokumentiert<br />
II) Der Source unübersichtlich gestaltet<br />
III) Die Schnittstelle nicht ausreichend definiert</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> Wenn ich mich darauf verlasse das erst der Kompiler mir sagen muss das ein möglicher Semantischer Fehler vorliegt:<br />
I) Ist keine ausreichende Prüfung des eigenen Source im zuge der Schnittstellen tests garantiert<br />
II) Ist dem programmierer nicht klar wie er das Object eigentlich behandeln will<br />
(Was auf ein Konzeptionellen Fehler im PAP zurück zu führen ist..)</p>
<p>So, nochmal zu den Casting types:</p>
<p><code>const_cast</code><br />
Wenn eine Schnittstelle einen Parameter als Const deklariert, ist diese<br />
auch als const zu verwenden! &quot;Don't define, what ya don't need!&quot;</p>
<p>Wenn das const weg gecasted wird um eine member fkt zu callen, die nicht<br />
für einen const garantiert, oder einen member zu verändern, so ist DEFENITIV<br />
die Schnittstelle (member func) falsch definiert!</p>
<p>Man stelle sich doch nur mal vor, in einem multithreaded-app Project verlässt sich ein Programmierer auf diese <code>const</code> spec, aber in wirklichkeit wird<br />
das ding einfach weggecasted um einen member zu verändern...<br />
..und schwup hat man einen laufzeitfehler 0x00....05 Access Error</p>
<p>Also nochmal &quot;Don't define, what ya don't need&quot;. Wird ein <code>const</code><br />
in der Definition garantiert, so MUSS sich der programmierer daran halten!</p>
<p>Fazit: <code>const_cast</code> ist unnötig, da es die specs umgeht..!</p>
<p><code>dynamic_cast</code> Der einzige sinnvolle einsatz wäre, den this ptr des<br />
eigenen objectes nicht manuell adjustieren zu müssen.<br />
Da es aber auch ohne geht (siehe geposteten Source^^) erübrigt sich die frage<br />
ob man das braucht.</p>
<p><code>reinterpret_cast</code><br />
Zu der MSDN lektüre, ja ein bissl aus dem kontext gerissen, aber gleich alles<br />
zu posten muss ja net sein <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="🙂"
    /><br />
Ein reinterpret_cast macht das gleiche wie, kopiere speicherbereich a,<br />
zu einem (prinzipiell) im stack initialiserten typen b.<br />
Also nichts weiter als ein grobes memcpy_s(&amp;b,sizeof(Typename T),a,sizeof(Typename T)).<br />
Und ein reinterpret_cast gewähleistet mir auch nicht das zur Laufzeit der addressierte<br />
speicherbereich von a valide ist und in der richtigen größe vorhanden ist.</p>
<p>Zu den Casting Member Operatoren:</p>
<pre><code class="language-cpp">//nur ein schnelles beispiel, für non-void ptrs die zu reinterpretieren sind
class Test
{
//...
public:
operator double() { return 1.0f;};
operator double*() { return new double(1.9f);};
}
</code></pre>
<p><code>static_cast</code><br />
Verhält sich exakt wie ein C_Cast.</p>
<p>Also nochmal zusammenfassend:<br />
Verwendet man <code>const_cast</code> hat man einen designfehler,<br />
<code>dynamic_cast</code> ist genauso sinnlos,<br />
<code>reinterpret_cast</code> hilft mir zur laufzeit bei void ptrs überhaupt nicht,<br />
ansonsten gibt es laufzeit ausführbare casting memberfkt's (operatoren)<br />
<code>static_cast</code> verhält sich wie ein C_Cast, laufzeit sicherheit ist auch nicht gewährleistet...</p>
<p>Die frage die sich mir dann stellt:<br />
<strong>Wo ist der Mehrwert?</strong></p>
<p>Bei einem C_Style Cast oder einer direkten zuweisung mit implizitem casting,<br />
wird gecheckt ob ein passender konvertierungsmechanismus vorhanden ist.</p>
<p>Ich würde auch nicht sagen, dass C_Casts eine Holzhammermethode ist,<br />
sondern C_Casts sind explicite anweisungen an den kompiler,<br />
wie er ein datensegment zu behandeln hat.</p>
<p>So zeit zum Krümmel Kacken <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>
<p>Statements requested ....<br />
---------------------------------------<br />
P.S.: Ziel der diskussion ist die Casting methoden auseinander zu nehmen und zu<br />
Erörtern... Nicht Euch meine meinung aufzustempeln! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007644</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 11:35:20 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 12:11:11 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Das Ziel meiner Argumentation ist, die Aussage verständlich zu machen:<br />
<strong>&quot;Es reicht C_Cast zu benützen!&quot;</strong></p>
</blockquote>
<p>Es reicht Assembler zu benützen.<br />
Das macht es noch lange keine gute Idee.</p>
<blockquote>
<p>Meine Argumentation basiert darauf, dass 50% der C++ Style Casts unnütz,<br />
und die anderen beiden so oder so auf C_Casts (oder Casting memberfkt's )<br />
zurück zu führen sind.</p>
</blockquote>
<p>Und genau das ist der Schwachsinn den wir hier bekriteln.<br />
Die C++ Casts sind deshalb so toll, weil sie precise sind. Ein static_cast sagt: hier passiert nichts unanständiges (reinterpret) und es wird kein const weggenommen.</p>
<p>Ein C Casts sag: ich mach aus A ein B, komme was wolle. Auch wenn A und B nichts miteinander zu tun haben, ich quetsch dass da zusammen und ignoriere const correctness dabei.</p>
<p>Ein reintrepret_cast ist fast wie ein C cast, mit dem unterschied dass er auf const correctness achtet. dh wenn ich einen reintrepret_cast sehe, dann weiss ich sofort: Achtung, da wird an den typen rumgemurkst - aber wenigstens kann ich mich auf const correctness verlassen.</p>
<p>dynamic_cast gibts in C sowieso nicht. Und const_cast ist super um zu sagen: hier tue ich nur das const wegnehmen. Das ist sofort eine rote Flagge: Warum will ich das? Aber ich weiss sofort was hier passiert.</p>
<blockquote>
<p>A) Wenn ich nicht erkenne, wo das explicite typensystem unterlaufen wird, ist:<br />
I) Der Source schlecht dokumentiert<br />
II) Der Source unübersichtlich gestaltet<br />
III) Die Schnittstelle nicht ausreichend definiert</p>
</blockquote>
<p>Äh, schonmal mit großen Projekten gearbeitet? Das mag in der Theorie ja gut klingen, dass du durch guten Code und gute Doku immer auch einen C Casts auf genau einen Verwendungszweck reduzieren kannst - in der Praxis ist das aber nicht möglich.</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> Wenn ich mich darauf verlasse das erst der Kompiler mir sagen muss das ein möglicher Semantischer Fehler vorliegt:</p>
</blockquote>
<p>Du willst das IMMER haben. Der Compiler soll dir IMMER sagen wenn du wo einen semantischen Fehler hast.</p>
<blockquote>
<p>I) Ist keine ausreichende Prüfung des eigenen Source im zuge der Schnittstellen tests garantiert<br />
II) Ist dem programmierer nicht klar wie er das Object eigentlich behandeln will<br />
(Was auf ein Konzeptionellen Fehler im PAP zurück zu führen ist..)</p>
</blockquote>
<p>Das ist wieder nur reine Theorie. In der Theorie ist jeder Source Code perfekt. In der Praxis aber ist es ungemein praktisch wenn der Compiler dabei hilft.</p>
<p>Der Rest des Postings von dir war nur blödsinn. Sorry. const_cast wird zB gebraucht um bei funktionen die handles auf interne Daten liefern (das objekt also nicht ändern) keine code duplizierung für const und nicht const zu haben. dynamic_cast kann verwendet werden um den Typ eines Objektes herauszufinden oder zB cross casts zu machen.</p>
<p>Bedenke, dass ein c casts all das macht, was du in C++ bei den casts für unnötig befindest. Wenn du zB sagst const und reintrepret sind unnötig: dann bedenke dass ein C cast genau das aber macht. Ein C casts ist eine const-static-reintrepret Mischung die ALLES erlaubt.</p>
<p>Deshalb: nur static_cast verwenden für die normalen Casts und man kann garkeine Fehler mehr machen. Bedenke, dass in der Programmierung es immer wichtig ist diese automatischen Kontrollen zu haben. In der Theorie sind wir alle vielleicht unfehlbar, in der Praxis passieren jedem von uns täglich mehrere Fehler. Wenn der Compiler mir den Fehler sofort anzeigt, spare ich massig Zeit.</p>
<p>PS:</p>
<blockquote>
<p>Bei einem C_Style Cast oder einer direkten zuweisung mit implizitem casting,<br />
wird gecheckt ob ein passender konvertierungsmechanismus vorhanden ist.</p>
</blockquote>
<p>Nein. Ein C Cast nimmt den Wert und steckt ihn in den Typen rein. Egal was. Egal wer. Egal wo. Du willst aus einem Vogel ein Auto machen? -&gt; C Cast kann das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007660</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 17 Jan 2011 12:11:11 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 13:46:00 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>zeusosc schrieb:</p>
<blockquote>
<p>Das Ziel meiner Argumentation ist, die Aussage verständlich zu machen:<br />
<strong>&quot;Es reicht C_Cast zu benützen!&quot;</strong></p>
</blockquote>
<p>Es reicht Assembler zu benützen.</p>
</blockquote>
<p>haha,.. ja <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>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>PS:</p>
<blockquote>
<p>Bei einem C_Style Cast oder einer direkten zuweisung mit implizitem casting,<br />
wird gecheckt ob ein passender konvertierungsmechanismus vorhanden ist.</p>
</blockquote>
<p>Nein. Ein C Cast nimmt den Wert und steckt ihn in den Typen rein. Egal was.<br />
Egal wer. Egal wo. Du willst aus einem Vogel ein Auto machen? -&gt; C Cast kann das.</p>
</blockquote>
<p>Nö,.. das ist schlichtweg falsch. Ein C_Cast unter einem C++ Compiler prüft ob<br />
dementsprechende operanden (Konvertierungsmechanismen) vorhanden sind<br />
und ersetzt diese dann:</p>
<pre><code class="language-asm">Test a;
00297B7B  lea         ecx,[a] 
00297B81  call        Test::Test (2986F0h) 
Test b(a);
00297B86  lea         eax,[a] 
00297B8C  push        eax  
00297B8D  lea         ecx,[b] 
00297B93  call        Test::Test (298710h) 
double d=(double)b;
00297B98  lea         ecx,[b] 
00297B9E  call        Test::operator double (298760h) 
00297BA3  fstp        qword ptr [d]
</code></pre>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ein reintrepret_cast ist fast wie ein C cast, mit dem unterschied dass er auf<br />
const correctness achtet. dh wenn ich einen reintrepret_cast sehe, dann weiss<br />
ich sofort: Achtung, da wird an den typen rumgemurkst - aber wenigstens kann<br />
ich mich auf const correctness verlassen.</p>
</blockquote>
<pre><code class="language-cpp">int *k=0;
const int j=5;
k=reinterpret_cast&lt;int*&gt;(&amp;j); // ERROR: C2440 cannot convert from 'const int *' to 'int *'
//1&gt;        Conversion loses qualifiers
*k=3;
</code></pre>
<p>Richtig.. kann man,...<br />
Braucht man es wenn die schnittstelle definiert das es ein const sein muss?</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Und const_cast ist super um zu sagen: hier tue ich nur das const wegnehmen. Das ist sofort eine rote Flagge: Warum will ich das? Aber ich weiss sofort was hier passiert.</p>
<blockquote>
<p>A) Wenn ich nicht erkenne, wo das explicite typensystem unterlaufen wird, ist:<br />
I) Der Source schlecht dokumentiert<br />
II) Der Source unübersichtlich gestaltet<br />
III) Die Schnittstelle nicht ausreichend definiert</p>
</blockquote>
<p>Äh, schonmal mit großen Projekten gearbeitet? Das mag in der Theorie ja gut<br />
klingen, dass du durch guten Code und gute Doku immer auch einen C Casts auf<br />
genau einen Verwendungszweck reduzieren kannst - in der Praxis ist das aber<br />
nicht möglich.</p>
</blockquote>
<p>Und ob das möglich ist,... nehmen wir ein beispiel:</p>
<pre><code class="language-cpp">class Test
{
private:
bool a;

public:
bool Methode_a(void)
{ return this-&gt;a; }

Test &amp; operator=(const Test &amp;b)
{
		if(this==&amp;b) return *this;

		this-&gt;a=b.Methode_a(); //error C2662: 'Test::Methode_a' : cannot convert 'this' pointer from 'const Test' to 'Test &amp;'
1&gt;        Conversion loses qualifiers

		return *this;
};
</code></pre>
<p>Füge ich hingegen eine <code>const</code> -Qualifizierte überladung durch:</p>
<pre><code class="language-cpp">bool Methode_a(void) const
{
 return this-&gt;a;
}
</code></pre>
<p>Wird ohne Murksen kompiliert. Und das auch mit grund.<br />
Setzt man das in verbindung mit den casting operatoren,<br />
schon hat man ein <code>const safe type (C Style) casting</code><br />
,....</p>
<p>Nehmen wir noch ein anderes Beispiel:</p>
<pre><code class="language-cpp">Test&amp; Eine_Beispiel_Function( const void * foo)
{
 Test * a = ( const Test*) foo; // error: cannot convert from 'const Test *' to 'Test *'
 a=(Test*)foo; //kein error &lt;- einzige variante die einen fehler verursachen könnte, wenn man in der behandlung nicht aufpasst
 a=reinterpret_cast&lt;const Test*&gt;(foo); // error: cannot convert from 'const Test *' to 'Test *'
 a=reinterpret_cast&lt;Test*&gt;(foo); //error:  cannot convert from 'const void *' to 'Test *'
 const Test *b=(Test*) foo; //kein error, und auch nicht falsch
 b= reinterpret_cast&lt;Test*&gt;(foo); //error: cannot convert from 'const void *' to 'Test *'
 b=(const Test*)foo;//kein error, und auch nicht falsch
 b=reinterpret_cast&lt;const Test*&gt;(foo);//kein error und auch net falsch

return *a;
};
</code></pre>
<p>D.h. ist eine <code>const</code> Eigenschaft für das element über die deklaration<br />
gegeben, so muss ich die natürlich für den gecasteten typen übernehmen..</p>
<pre><code class="language-cpp">const Test * b= (Test*) foo;
</code></pre>
<p>ist für die behandlung mehr als ausreichend, wenn ein cast<br />
auf ein element das <code>const</code> -attribut erforderlich ist.</p>
<p>Ich kenne (also) kein Beispiel das mir die Erforderniss von<br />
<code>const_cast</code> und <code>reinterpret_cast</code> klar macht (unter berücksichtigung benannter typenbehandlung)!</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Bedenke, dass ein c casts all das macht, was du in C++ bei den casts für<br />
unnötig befindest. Wenn du zB sagst const und reintrepret sind unnötig: dann<br />
bedenke dass ein C cast genau das aber macht. Ein C casts ist eine const-static-<br />
reintrepret Mischung die ALLES erlaubt.</p>
</blockquote>
<p>Unter einem C++ Kompiler macht ein C_Cast das eben nicht.<br />
Dieser wird wie ein konvertierungs-operator behandelt (siehe gaaanz oben in diesem Post)<br />
welche ausreichend deklariert und definiert werden müssen. <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>Verzichtet man hingegen darauf, ist es klar das die typenbehandlung ausgelagert werden muss.</p>
<p>Grüüüüüüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007716</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 13:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 14:08:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14077">@zeusosc</a>:<br />
C++ Style Casts sind genau so nützlich oder unnütz wie <code>const</code> , dass Integers nicht automatisch zu Enum Typen konvertiert werden dürfen, dass void-Pointer nicht automatisch in typisierte Zeiger konvertiert werden dürfen und 100 andere Sachen in C++, die nur dazu da sind Fehler zu vermeiden.</p>
<p>Wenn du lieber etwas schreibst wo der Compiler viel weniger Chancen hat von dir unbeabsichtigte Fehler zu finden: fein. Mach es so. Aber bewirb es bloss nicht hier, oder behaupte dass C++ Style Casts deswegen unnötig wären, weil du nicht verstanden hast wozu sie gut sind (oder sie einfach trotzdem nicht verwenden willst).</p>
<blockquote>
<p>Unter einem C++ Kompiler macht ein C_Cast das eben nicht.<br />
Dieser wird wie ein konvertierungs-operator behandelt (siehe gaaanz oben in diesem Post)<br />
welche ausreichend deklariert und definiert werden müssen.</p>
</blockquote>
<p>Ein C Style Cast macht unter C++ so ziemlich alles, inklusive const_ und reinterpret_cast. Steht auch so im Standard.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007731</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 14:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 14:09:47 GMT]]></title><description><![CDATA[<p>Gerade dein Beispiel &quot;Eine_Beispiel_Function widerlegt&quot; doch das, was du uns nahebringen willst: Die Kernaussage ist &quot;be precise&quot;, und indem du eine Funktion mit einem void Pointer hast, bei der der Pointer auf eine Klasse zeigt ist der Ansatz doch schon völlig falsch. Entweder benutzt man statischen Polymorphismus durch templates oder Laufzeitpolymorphismus durch Vererbung.<br />
Deine Funktion erlaubt es, Birnenbäume zu übergeben und erwartet Fensterhandles, robuste Programmierung ist etwas anderes.<br />
Casts werden dazu benutzt, um Brücken zu schlagen, wobei dir bei den C++ casts der Compiler klar sagt, welche Brücken erlaubt sind und welche nicht, d.h. er erkennt bereits zur Compile time mögliche Fehler und garantiert Typsicherheit. Bei C casts ist das eben nicht so, das ist wie Hochseilakrobatik ohne Netz. Geht meistens gut, muss aber nicht, und wenn nicht, dann fatal. Allein diese Tatsache macht diese Diskussion hinfällig, wenn jemand so programmieren möchte kann er das gerne tun, aber die Behauptung, das sei besserer Stil und schneller lässt mich aus der Diskussion aussteigen. Über Nonsens diskutiert man nicht, Punkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007732</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 17 Jan 2011 14:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 14:11:15 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Nö,.. das ist schlichtweg falsch. Ein C_Cast unter einem C++ Compiler prüft ob<br />
dementsprechende operanden (Konvertierungsmechanismen) vorhanden sind<br />
und ersetzt diese dann:</p>
</blockquote>
<pre><code class="language-cpp">class A {};
class B {};

void f(B const&amp; b) {}

int main() {
   A a;
   f((B const&amp;)a);  //geht
   //f(static_cast&lt;B const&amp;&gt;(a)); //geht nicht
}
</code></pre>
<p>Der Rest deines Posts ist etwa genauso wahr wie diese Aussage.<br />
Deshalb beende ich es für mich.</p>
<p>Nur weil du ein Beispiel bringst wo const cast nicht notwendig ist, heisst es nicht dass const cast NIE notwendig ist. btw c casts sind immer auch const casts...</p>
<blockquote>
<p>Ich kenne (also) kein Beispiel das mir die Erforderniss von<br />
const_cast und reinterpret_cast klar macht (unter berücksichtigung benannter typenbehandlung)!</p>
</blockquote>
<p>const cast Beispiel:</p>
<pre><code class="language-cpp">class A {
private:
   int i;

public:
   int getI() const { return const_cast&lt;A*&gt;(this)-&gt;getI(); }
   int&amp; getI() { return i; }
};
</code></pre>
<p>Stell dir vor getI sei komplex.</p>
<p>Beispiel für reintrepret_cast:</p>
<pre><code class="language-cpp">int buffer;
   char* bytes;
   bytes = reinterpret_cast&lt;char*&gt;(&amp;buffer);
</code></pre>
<p>Du willst zB ein Sammlung von ints als einzelne Bytes behandeln bzw. einen Bytestrom als eine Ansammlung von ints.</p>
<p>Es gibt millionen Fälle wo dieser oder jener Cast praktisch ist. Bedenke bitte: der C Cast macht immer reintrepret+const Cast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007733</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 17 Jan 2011 14:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 14:18:52 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Nö,.. das ist schlichtweg falsch. Ein C_Cast unter einem C++ Compiler prüft ob<br />
dementsprechende operanden (Konvertierungsmechanismen) vorhanden sind<br />
und ersetzt diese dann</p>
</blockquote>
<p>Ein C-Cast versucht die Typen irgendwie umzubiegen. Sofern das geht, wird es getan. Darunter fallen viele unerwünschte Fälle.</p>
<p>Und was der Assemblercode an dieser Stelle soll, erschliesst sich mir nicht. Aber wie schon im anderen Thread ist er ein schlechtes Argument.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>Und ob das möglich ist,... nehmen wir ein beispiel:</p>
<pre><code class="language-cpp">bool Methode_a(void)
{ return this-&gt;a; }

Test &amp; operator=(const Test &amp;b)
{
		if(this==&amp;b) return *this;

		this-&gt;a=b.Methode_a(); //error C2662: 'Test::Methode_a' : cannot convert 'this' pointer from 'const Test' to 'Test &amp;'
1&gt;        Conversion loses qualifiers

		return *this;
};
</code></pre>
</blockquote>
<p>Nur schade, dass hier nirgends ein C-Cast im Spiel ist...</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>Unter einem C++ Kompiler macht ein C_Cast das eben nicht.</p>
</blockquote>
<p>Natürlich ist ein C-Cast die Kombination von <code>static_cast</code> , <code>reinterpret_cast</code> und <code>const_cast</code> und je nachdem wird auch mehreres auf einmal angewandt. Und wie du auf Konvertierungsoperatoren (das sind die Memberfunktionen) kommst, weiss ich auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007737</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Jan 2011 14:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 16:16:30 GMT]]></title><description><![CDATA[<p>Au,.. so viele schöne kontras <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>Nexus schrieb:</p>
<blockquote>
<p>Und was der Assemblercode an dieser Stelle soll, erschliesst sich mir nicht.<br />
Aber wie schon im anderen Thread ist er ein schlechtes Argument.</p>
</blockquote>
<p>..um präzise zu sein, ist das kein Argument sondern ein Beweissmitteln zur untermauerung meiner Argumentation...</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Und wie du auf Konvertierungsoperatoren (das sind die Memberfunktionen) kommst, weiss ich auch nicht.</p>
</blockquote>
<p>Ok, mal gucken ob ich Dir es so näher bringen kann... (Schau es Dir aber auch an)</p>
<p>Um die mechanismen zu verstehen, die man benutzt, muss man sich auch anschauen<br />
wie diese umgesetzt werden. Das mache ich jetzt (nochmal... ich weiß jaja <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>Als C -Style Cast bezeichne ich:</p>
<pre><code class="language-cpp">Object_A objA;
Object_B B = (Object_B) objA;
</code></pre>
<p>Im konkreten Fall bei einem Casting eines Objectes zu einem Basistypen:</p>
<pre><code class="language-asm">Test a;
012A7B7B  lea         ecx,[a] 
012A7B81  call        Test::Test (12A86F0h) 

double d=(double)a;
012A7B86  lea         ecx,[a] 
012A7B8C  call        Test::operator double (12A8710h) 
012A7B91  fstp        qword ptr [d] 

double*e=(double*)a;
012A7B97  lea         ecx,[a] 
012A7B9D  call        Test::operator double * (12A8730h) 
012A7BA2  mov         dword ptr [e],eax
</code></pre>
<p>Für das Object:</p>
<pre><code class="language-cpp">class Test
{
private:
	double d;
public:
	Test(){};
	operator double() { return this-&gt;d;};
  	operator double*() { return &amp;this-&gt;d;};
};
</code></pre>
<p>Wie man in der <strong>assembly sehen kann</strong>, wird der C_Cast auf die spezifischen<br />
casting operator umgeleitet.</p>
<p>Das Argument bezog sich darauf, das ein C_Cast in der übersetzung keine<br />
&quot;Umbiegung&quot; ist, sondern explicit nach einer <strong>definierten Konvertierung gesucht und ersetzt wird</strong>.<br />
Das ist bei der deklaration von dem Casting operator &quot;operator double()&quot; der<br />
Fall&quot;. Das gleiche gilt für einen RVALUE type void*, sofern dieser implementiert ist.</p>
<p>Die Folgerung dieses Beispiels ist:<br />
Wenn man ein Object casten will, kann man das laufzeitkonvertierungsmechanismen<br />
überlassen, die auch auf korrektheit des typs prüfen können. Und das mit<br />
C Style Casts, die ja wie oben gezeigt, wenn implementiert, in Casting Methoden<br />
umegeleitet werden.</p>
<p><strong>Frage: Ist diese Folgerung falsch?</strong></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Nur schade, dass hier nirgends ein C-Cast im Spiel ist...</p>
</blockquote>
<p>Bezog sich eher auf die (nicht) notwendigkeit von const_cast,....<br />
das kam vlt. nicht so rüber...</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class A {
private:
   int i;

public:
	A() { i=0;};
	A(const A&amp; a) { this-&gt;i=a.getI(); };
   int getI() const { return const_cast&lt;A*&gt;(this)-&gt;getI(); }
   int&amp; getI() { return i; }
};
</code></pre>
</blockquote>
<p>Ein schönes Beispiel.<br />
Da aber getI() nicht komplex ist reicht auch:</p>
<pre><code class="language-cpp">int &amp;getI() { return i;}
int const &amp;getI() const { return i;}
</code></pre>
<p>Hast Du vlt. noch ein anders Beispiel?</p>
<p>DocShoe schrieb:</p>
<blockquote>
<p>und indem du eine Funktion mit einem void Pointer hast, bei der der Pointer auf<br />
eine Klasse zeigt ist der Ansatz doch schon völlig falsch. Entweder benutzt<br />
man statischen Polymorphismus durch templates oder Laufzeitpolymorphismus durch Vererbung.</p>
</blockquote>
<p>Ja, da hast du recht.<br />
Dabei bezog ich mich aber auf Beispiele für den Verwendungszweck, welche in<br />
referenzen von <code>reinterpret_cast</code> vorliegen:<br />
<a href="http://msdn.microsoft.com/en-us/library/e0w9f63b%28VS.80%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/e0w9f63b(VS.80).aspx</a><br />
Das reicht aber um den worst case des Anwendungsfalls zu verdeutlichen.</p>
<p>hustbear schrieb:</p>
<blockquote>
<p>Aber bewirb es bloss nicht hier, oder behaupte dass C++ Style Casts deswegen<br />
unnötig wären, weil du nicht verstanden hast wozu sie gut sind (oder sie<br />
einfach trotzdem nicht verwenden willst).</p>
</blockquote>
<p>Mensch hustbear, ich habe doch schon in einem vorherigen Post geschrieben was<br />
meine intension ist. Aber Dir zu liebe nochmal:</p>
<p>ich schrieb:</p>
<blockquote>
<p>Das Ziel meiner Argumentation ist, die Aussage verständlich zu machen:<br />
&quot;Es reicht C_Cast zu benützen!&quot;<br />
(Ich habe nicht gesagt: macht das alle so, sonst gibt auf die nuss <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="😉"
    /> )<br />
...<br />
P.S.: Ziel der diskussion ist die Casting methoden auseinander zu nehmen und zu<br />
Erörtern... Nicht Euch meine meinung aufzustempeln! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
</blockquote>
<p>Ich habe nicht gesagt das ein C_Cast kein reinterpret_cast, kein static_cast, kein const_cast und auch kein dynamic_cast macht.</p>
<p>Das was ich sage ist: Wenn man weiß, und testet, wie der (oder ein) C_Cast<br />
sich auf das datensegment von einem Basistyp oder anderes Object (oder ptr) auswirkt,<br />
sowie methoden und/oder funktionen implementiert die eine richtige Behandlung und Prüfung zur Kompilierzeit und zur Laufzeit sicherstellen, dann sind<br />
(oder sollten) alle relevanten qualitätsmerkmale (á la SQuaRE) erfüllt sein.</p>
<p>Es ist natürlich richtig das jede meldung im Compiler das Leben des Programmierers vereinfacht und gerade unter Termindruck flüchtigkeitsfehler<br />
ausschließen will.</p>
<p>Wenn ich vergessen habe auf irgendein statement von euch genauer einzugehen, sagt nochmal bÖscheid.</p>
<p>grüüßli <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/2007803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007803</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 16:16:30 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 16:36:52 GMT]]></title><description><![CDATA[<p>Machen denn hier der C-Style cast und der static_cast auch das gleiche?</p>
<pre><code class="language-cpp">class A;
class B;

B&amp; toB1( A&amp; aA )
{
        return (B&amp;)aA;
}

B&amp; toB2( A&amp; aA )
{
        return static_cast&lt;B&amp;&gt;(aA);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2007808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007808</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 17 Jan 2011 16:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 16:48:15 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>Ok, mal gucken ob ich Dir es so näher bringen kann... (Schau es Dir aber auch an)</p>
</blockquote>
<p>Du solltest bedenken dass Nexus von C++ ein paar Ecken mehr versteht als du bevor du solche Formulierungen verwendest...</p>
<blockquote>
<p>Wenn man ein Object casten will, kann man das laufzeitkonvertierungsmechanismen<br />
überlassen, die auch auf korrektheit des typs prüfen können. Und das mit<br />
C Style Casts, die ja wie oben gezeigt, wenn implementiert, in Casting Methoden<br />
umegeleitet werden.</p>
<p><strong>Frage: Ist diese Folgerung falsch?</strong></p>
</blockquote>
<p>Ja. Sie ist komplett falsch.<br />
Natürlich findest du Situationen wo C Casts genau das richtige tun. Es ist ja nicht so als wären sie kaputt und würden nicht funktionieren. Aber das geht eben komplett am Thema vorbei. Schau dir mein Codebeispiel mal an (und vergiss den Assembler Code der sagt nichts aus):</p>
<pre><code class="language-cpp">class A {}; 
class B {}; 

void f(B const&amp; b) {} 

int main() { 
   A a; 
   f((B const&amp;)a);  //geht 
   //f(static_cast&lt;B const&amp;&gt;(a)); //geht nicht 
}
</code></pre>
<p>Ein simpler, einfacher Gegenbeweis.<br />
C Casts machen böse Sachen. Die Konvertierung von a nach B ist illegal. C Casts machen sie dennoch. Das ist Gefährlich. Deshalb: c++ casts verwenden.</p>
<blockquote>
<p>Bezog sich eher auf die (nicht) notwendigkeit von const_cast,....</p>
</blockquote>
<p>Du kannst nicht mit einem Beispiel wo X nicht notwendig ist Beweisen, dass X nie notwendig ist. So funktioniert das nicht.</p>
<blockquote>
<p>Ein schönes Beispiel.<br />
Da aber getI() nicht komplex ist reicht auch:</p>
<pre><code class="language-cpp">int &amp;getI() { return i;}
int const &amp;getI() const { return i;}
</code></pre>
</blockquote>
<p>Stell dir einfach vor getI sei komplex. Man kann immer etwas drum herum bauen - klar. Aber das hier ist ein Fall wo man idR mit const_cast am besten fährt.</p>
<blockquote>
<p>Hast Du vlt. noch ein anders Beispiel?</p>
</blockquote>
<p>Klar. Wenn man eine API verwenden muss die nicht const-correct ist.</p>
<blockquote>
<p>Das Ziel meiner Argumentation ist, die Aussage verständlich zu machen:<br />
&quot;Es reicht C_Cast zu benützen!&quot;</p>
</blockquote>
<p>Wie schon gesagt: nur weil man etwas machen kann, ist es noch lange keine gute Idee. C Casts sind eine furchtbar dumm Idee. Aber klar, ich kann auch freihändig mit dem Auto auf der Autobahn fahren. Klar geht das. Aber eine gute Idee ist etwas anderes.</p>
<blockquote>
<p>Das was ich sage ist: Wenn man weiß, und testet, wie der (oder ein) C_Cast<br />
sich auf das datensegment von einem Basistyp oder anderes Object (oder ptr) auswirkt,<br />
sowie methoden und/oder funktionen implementiert die eine richtige Behandlung und Prüfung zur Kompilierzeit und zur Laufzeit sicherstellen, dann sind<br />
(oder sollten) alle relevanten qualitätsmerkmale (á la SQuaRE) erfüllt sein.</p>
</blockquote>
<p>Du erreichst mit enromen mehr Aufwand ein fast so gutes Ergebnis wie mit C++ Casts. Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007816</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 17 Jan 2011 16:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 16:54:47 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>...</p>
<p>Wie man in der <strong>assembly sehen kann</strong>, wird der C_Cast auf die spezifischen<br />
casting operator umgeleitet.</p>
<p>Das Argument bezog sich darauf, das ein C_Cast in der übersetzung keine<br />
&quot;Umbiegung&quot; ist, sondern explicit nach einer <strong>definierten Konvertierung gesucht und ersetzt wird</strong>.</p>
</blockquote>
<p>Worauf willst du eigentlich hinaus? Es ist schon klar, dass genau definiert ist, was der C-Cast macht. Es geht darum, dass man es ihm nicht unbedingt ansieht, weil er alles machen könnte. Einmal nicht aufgepasst (egal ob an Stelle des Casts oder irgendwo weit vorher) -&gt; kein Compilerfehler, aber dafür semantischer Fehler im Programm. Sehr schwer zu finden. Besonders da man die C-Casts noch nicht einmal gut suchen kann.</p>
<blockquote>
<p>Bezog sich eher auf die (nicht) notwendigkeit von const_cast,....<br />
das kam vlt. nicht so rüber...</p>
</blockquote>
<p>Schön. const_cast ist auch nicht nötig und wenn man es doch braucht, dann ist das ein Warnsignal, dass etwas falsch ist. Wieso wolltest du nochmal einen Cast benutzen, der const_cast mit beinhaltet und bei dem man nicht einmal merkt, dass man ihn benutzt?</p>
<blockquote>
<p>Ja, da hast du recht.<br />
Dabei bezog ich mich aber auf Beispiele für den Verwendungszweck, welche in<br />
referenzen von <code>reinterpret_cast</code> vorliegen:<br />
<a href="http://msdn.microsoft.com/en-us/library/e0w9f63b%28VS.80%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/e0w9f63b(VS.80).aspx</a><br />
Das reicht aber um den worst case des Anwendungsfalls zu verdeutlichen.</p>
</blockquote>
<p>Schön. reinterpret_cast ist auch nicht nötig und wenn man es doch braucht, dann ist das ein Warnsignal, dass etwas falsch ist. Wieso wolltest du nochmal einen Cast benutzen, der reinterpret_cast mit beinhaltet und bei dem man nicht einmal merkt, dass man ihn benutzt?</p>
<blockquote>
<p>&quot;Es reicht C_Cast zu benützen!&quot;</p>
</blockquote>
<p>Es gibt viele Sachen die ausreichend sind, aber deshalb ist es noch lange nicht gut, so zu handeln.</p>
<blockquote>
<p>Das was ich sage ist: Wenn man weiß, und testet, wie der (oder ein) C_Cast<br />
sich auf das datensegment von einem Basistyp oder anderes Object (oder ptr) auswirkt,<br />
sowie methoden und/oder funktionen implementiert die eine richtige Behandlung und Prüfung zur Kompilierzeit und zur Laufzeit sicherstellen, dann sind<br />
(oder sollten) alle relevanten qualitätsmerkmale (á la SQuaRE) erfüllt sein.</p>
</blockquote>
<p>Schön. Also anstatt eine semantische Prüfung durch den Compiler automatisiert vorzunehmen, soll ich jetzt umfangreiche Tests machen. Da habe ich ja echt viel gewonnen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> .</p>
<blockquote>
<p>Es ist natürlich richtig das jede meldung im Compiler das Leben des Programmierers vereinfacht und gerade unter Termindruck flüchtigkeitsfehler<br />
ausschließen will.</p>
</blockquote>
<p>Warum willst du sie dann umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007822</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 17 Jan 2011 16:54:47 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 17:39:36 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>hustbear schrieb:</p>
<blockquote>
<p>Aber bewirb es bloss nicht hier, oder behaupte dass C++ Style Casts deswegen<br />
unnötig wären, weil du nicht verstanden hast wozu sie gut sind (oder sie<br />
einfach trotzdem nicht verwenden willst).</p>
</blockquote>
<p>Mensch hustbear, ich habe doch schon in einem vorherigen Post geschrieben was<br />
meine intension ist. Aber Dir zu liebe nochmal:</p>
<p>ich schrieb:</p>
<blockquote>
<p>Das Ziel meiner Argumentation ist, die Aussage verständlich zu machen:<br />
&quot;Es reicht C_Cast zu benützen!&quot;<br />
(Ich habe nicht gesagt: macht das alle so, sonst gibt auf die nuss <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="😉"
    /> )<br />
...<br />
P.S.: Ziel der diskussion ist die Casting methoden auseinander zu nehmen und zu<br />
Erörtern... Nicht Euch meine meinung aufzustempeln! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
</blockquote>
<p>Ich habe nicht gesagt das ein C_Cast kein reinterpret_cast, kein static_cast, kein const_cast und auch kein dynamic_cast macht.</p>
<p>Das was ich sage ist: Wenn man weiß, und testet, wie der (oder ein) C_Cast<br />
sich auf das datensegment von einem Basistyp oder anderes Object (oder ptr) auswirkt,<br />
(...)</p>
</blockquote>
<p>Mal abgesehen davon dass du eine sehr eigenwillige (und IMO total falsche) Interpretation von &quot;Datensegment&quot; hast...</p>
<p>Ja, wenn man weiss was man tut kann man auf C++ Style Casts verzichten, solange man keinen <code>dynamic_cast</code> braucht.<br />
Nur wieso sollte man das wollen?<br />
Wenn man weiss was man tut kann man wie gesagt auf viel verzichten. Man kann überall das const weglassen und statt <code>T const&amp;</code> überall <code>T&amp;</code> rumreichen. Führt zu toll unwartbarem Code.<br />
Genauso führt IMO die Verwendung von C-Style Casts zu toll unwartbarem Code.</p>
<p>Dass es geht wurde jetzt glaube ich schon oft genug festgestellt. Also worum geht es dir jetzt noch, abgesehen von dieser (IMO ziemlich wertlosen) Feststellung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007859</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 17:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to casten on Mon, 17 Jan 2011 17:56:56 GMT]]></title><description><![CDATA[<p>@Shade:</p>
<p>Ich wollte niemanden ans Bein pinkeln. Sollte es so rübergekommen sein, dann<br />
entschuldige ich mich gerne. Ich hatte bei der Aussage zu Nexus nur den eindruck<br />
er hätte mein Post zu rasch überflogen... Daher entschuldige Nexus...</p>
<p>@Shade + SeppJ:<br />
Eure beiden aussagen (mal zusammengefasst)<br />
&quot;Mit mehr aufwand für ein ordentliches C_Cast erreicht man das gleiche wie<br />
es die C++ Style Casts schon (viel einfacher) machen!&quot; finde ich gut und bringt<br />
die sache glaube ich auch auf exakt den Punkt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Blöd ist: ich habe jetzt summa sumarum keine Gegenargumente mehr ...</p>
<p>Daher thx at all <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
---------------------------------------<br />
Edit:</p>
<p>hustbear schrieb:</p>
<blockquote>
<p>Dass es geht wurde jetzt glaube ich schon oft genug festgestellt. Also worum geht es dir jetzt noch, abgesehen von dieser (IMO ziemlich wertlosen) Feststellung?</p>
</blockquote>
<p>Das wars eigentlich schon,.. trozdem danke <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/2007891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007891</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Mon, 17 Jan 2011 17:56:56 GMT</pubDate></item></channel></rss>