<?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[Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe eine Klasse mit einer inneren Proxyklasse, in etwa sowas:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Matrix_2D
{
private:
    T **pMatrix;
    // ...
public:
    class Proxy
    {
    private:
        // ...
    public:
        Proxy(const Matrix_2D&lt;T&gt;&amp; matrix, const int x);
        // ...
    };

    const Proxy&amp; operator[](int x) const;
    Proxy&amp; operator[](int x);
};

// ...

template&lt;class T&gt;
const Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}

template&lt;class T&gt;
Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x)
{
    return Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>Das Ziel hier ist es auf ein Objekt &quot;obj&quot; der Klasse Matrix_2D per obj[x][y] zuzugreifen. dazu wird vom Matrix_2D&lt;T&gt;::operator[] ein Proxy erzeugt und zurueckgegeben (obige Funktionen), welcher von der Funktion Matrix_2D&lt;T&gt;::Proxy::operator[] dann fuer den y-Index abgefangen wird.</p>
<p>Mein Problem ist die Definition der beiden operator[] Funktionen ausserhalb der Klassendefinition oben. Und zwar ohne &quot;template&quot; compiliert und laeuft der Code einwandfrei, jedoch mit &quot;template&quot; und deklariert wie oben - bekomme ich folgende Fehlermeldung (Zeilen sind die beiden Kopfzeilen der beiden Funktionen):</p>
<pre><code>139: error: expected initializer before &quot;&amp;&quot; token
147: error: expected constructor, destructor, or type conversion before &quot;&amp;&quot; token
</code></pre>
<p>Es scheint als ob &quot;Proxy&quot; hier nicht als &quot;Typ&quot; erkannt wird. Matrix_2D&lt;T&gt;::Proxy ebenfalls nicht.</p>
<p>Frage, also: Wie definiere ich eine Innere Klasse als Typ fuer wie zB in diesem Fall den Rueckgabewert einer Funktion?</p>
<p>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/topic/224449/innere-klasse-wird-bei-templatedeklaration-nicht-als-typ-erkannt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 18:26:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224449.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Oct 2008 15:43:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Thu, 09 Oct 2008 15:43:44 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe eine Klasse mit einer inneren Proxyklasse, in etwa sowas:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Matrix_2D
{
private:
    T **pMatrix;
    // ...
public:
    class Proxy
    {
    private:
        // ...
    public:
        Proxy(const Matrix_2D&lt;T&gt;&amp; matrix, const int x);
        // ...
    };

    const Proxy&amp; operator[](int x) const;
    Proxy&amp; operator[](int x);
};

// ...

template&lt;class T&gt;
const Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}

template&lt;class T&gt;
Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x)
{
    return Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>Das Ziel hier ist es auf ein Objekt &quot;obj&quot; der Klasse Matrix_2D per obj[x][y] zuzugreifen. dazu wird vom Matrix_2D&lt;T&gt;::operator[] ein Proxy erzeugt und zurueckgegeben (obige Funktionen), welcher von der Funktion Matrix_2D&lt;T&gt;::Proxy::operator[] dann fuer den y-Index abgefangen wird.</p>
<p>Mein Problem ist die Definition der beiden operator[] Funktionen ausserhalb der Klassendefinition oben. Und zwar ohne &quot;template&quot; compiliert und laeuft der Code einwandfrei, jedoch mit &quot;template&quot; und deklariert wie oben - bekomme ich folgende Fehlermeldung (Zeilen sind die beiden Kopfzeilen der beiden Funktionen):</p>
<pre><code>139: error: expected initializer before &quot;&amp;&quot; token
147: error: expected constructor, destructor, or type conversion before &quot;&amp;&quot; token
</code></pre>
<p>Es scheint als ob &quot;Proxy&quot; hier nicht als &quot;Typ&quot; erkannt wird. Matrix_2D&lt;T&gt;::Proxy ebenfalls nicht.</p>
<p>Frage, also: Wie definiere ich eine Innere Klasse als Typ fuer wie zB in diesem Fall den Rueckgabewert einer Funktion?</p>
<p>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/1596413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596413</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Thu, 09 Oct 2008 15:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Thu, 09 Oct 2008 15:56:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class T&gt; 
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
</code></pre>
<p>typename muss da hin, da der Compiler nicht wissen kann, was Proxy sein wird, da T unbekannt ist. Per default, wird in so einem Fall angenommen, dass Proxy ein Wert ist, was hier logischerweise ein Fehler verursacht.</p>
<p>Im übrigen empfehle ich keine Referenz auf ein temporäres Objekt zurück zu geben. Das führt im allgemeinen zu unschönen Abstürzen <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596430</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 09 Oct 2008 15:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Thu, 09 Oct 2008 18:38:48 GMT]]></title><description><![CDATA[<p>Hi, ja das hab ich auch schon ausprobiert...</p>
<p>also folgendes hilft zwar den ersten Fehler zu vermeiden:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
const typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}
</code></pre>
<p>Aber bei folgendem:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
{
    return Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>..erhalte ich immer:</p>
<pre><code>147: error: dependent-name &quot;Matrix_2D::Proxy&quot; is parsed as a non-type, but instantiation yields a type
147: note: say &quot;typename Matrix_2D::Proxy&quot; if a type is meant
</code></pre>
<p>Ah ja?! So ein Spassvogel.. <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="😉"
    /> Das hab ich doch eig gemacht? Wie mach ich das bei der zweiten Deklaration, kann mir da jemand helfen? Geht das nur mit &quot;const&quot;? Warum?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Danke fuer den ersten Hinweis und den Hinweis mit den Referencen, hab das auch nochmal nachgelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596538</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Thu, 09 Oct 2008 18:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Thu, 09 Oct 2008 19:30:05 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Aber bei folgendem:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
{
    return Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>..erhalte ich immer:</p>
<pre><code>147: error: dependent-name &quot;Matrix_2D::Proxy&quot; is parsed as a non-type, but instantiation yields a type
147: note: say &quot;typename Matrix_2D::Proxy&quot; if a type is meant
</code></pre>
<p>Ah ja?! So ein Spassvogel.. <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="😉"
    /> Das hab ich doch eig gemacht?</p>
</blockquote>
<p>Nicht beim zweiten Mal, bei dem dieser Bezeichner auftritt. Das ist wesentlich, denn foo(argument-liste) ist entweder ein Cast, wenn foo ein Typ, oder ein Funktionsaufruf, wenn foo eine Funktion oder ein Objekt ist - aus dem Kontext kann der Compiler also nicht darauf schließen, dass Matrix_2D&lt;T&gt;::Proxy ein Typ ist, das musst du ihm folglich mitteilen (und zwar immer wieder). Zudem kannst du const/nicht-const Semantik mit Proxies nicht dadurch erreichen, das du den Rückgabewert mal const, mal nicht-const ausführst (nichts hindert den Aufrufer, deine const-Rückgabeproxie in einen non-const Proxie zu kopieren). Du brauchst hier zwei verschiedene Typen, wobei die nicht-const Version in die const-Version konvertierbar sein sollte. Als ganz analoges Anschauungsbeispiel können Iteratoren dienen. Mithin</p>
<pre><code class="language-cpp">template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
{
    return typename Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::ConstProxy Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return typename Matrix_2D&lt;T&gt;::ConstProxy(*this, x);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1596551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596551</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 09 Oct 2008 19:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 10:09:37 GMT]]></title><description><![CDATA[<p>Super, Danke Euch - jetzt laeufts!!<br />
Meine Loesung ist nun folgende:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
const typename Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}

template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x)
{
    return typename Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p><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/1596807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596807</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 10 Oct 2008 10:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 10:36:07 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Super, Danke Euch - jetzt laeufts!!<br />
Meine Loesung ist nun folgende:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
const typename Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}

template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy&amp; Matrix_2D&lt;T&gt;::operator[](int x)
{
    return typename Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p><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>
</blockquote>
<p>Mach das &amp; da weg. Du erzeugst ein temporäres Objekt, und gibst dann einen Referenz darauf zurück.<br />
Das Objekt ist aber nach dem Funktionsaufruf futsch -&gt; Nicht gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596842</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 10 Oct 2008 10:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 11:01:55 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Mach das &amp; da weg. Du erzeugst ein temporäres Objekt, und gibst dann einen Referenz darauf zurück.<br />
Das Objekt ist aber nach dem Funktionsaufruf futsch -&gt; Nicht gut.</p>
</blockquote>
<p>Das wurde schon gesagt. Und es wurde auch gesagt, dass der const_cast eine ganz schlechte Lösung ist. Aber anscheinend sind das unwichtige Informationen <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>Und vielleicht, falls jemand doch noch auf diese Vorschläge hört, sollte man noch erwähnen, dass man besser einen Zeiger auf die Matrix an Proxy übergibt, statt einer Referenz. Einen Zeiger kann man kopieren, eine Referenz kann man nicht kopieren.<br />
Aja und vielleicht sollte man sogar die Proxy Klasse private machen. So ist die Klasse wirklich nur auf die Verwendung in diesem Zusammenhang beschränkt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596861</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 10 Oct 2008 11:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 11:59:08 GMT]]></title><description><![CDATA[<p>Sry, die '&amp;' waren Schreibfehler (cpy/paste).</p>
<pre><code class="language-cpp">template&lt;class T&gt;
const typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}

template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
{
    return typename Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>const_cast<br />
Das ist ein Problem, das mir noch nicht 100% klar ist. Ich habe mich hier an Scott Meyers orientiert, dort werden in einem Beispiel beide Versionen der operator[]() wie oben einmal mit und einmal ohne const implementiert. Da die Funktion als &quot;xxx() const&quot; definiert ist, brauch ich hier doch den const_cast um das wieder zu lockern (oder nicht?). Wozu brauche ich eine Const und eine ohne-Const Version (such das gerade nochmal im Buch, ich glaube da stand was..) Afaik ist jegliches casten ja immer eher schlecht, da es das eigentliche Konzept aufbricht, oder?!</p>
<p>private<br />
ja hab ich schliesslich auch gemacht.</p>
<p>Danke fuer die Hinweise!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596898</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 10 Oct 2008 11:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 12:05:27 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Da die Funktion als &quot;xxx() const&quot; definiert ist, brauch ich hier doch den const_cast um das wieder zu lockern (oder nicht?).</p>
</blockquote>
<p>Nein, nicht. Welchen Sinn hat es, eine Funktion <code>const</code> zu machen, aber das <code>const</code> mit <code>const_cast</code> wieder aufzubrechen?</p>
<p>Fabeltier schrieb:</p>
<blockquote>
<p>Afaik ist jegliches casten ja immer eher schlecht, da es das eigentliche Konzept aufbricht, oder?!</p>
</blockquote>
<p>Natürlich nicht. <code>static_cast</code> ist meistens legitim. <code>reinterpret_cast</code> ist manchmal halt nötig. <code>const_cast</code> sollte man möglichst vermeiden, und <code>dynamic_cast</code> ist zwar teilweise praktisch, wird aber von vielen als Designfehler angesehen. Man sollte in C++ darauf achten, nicht den C-Cast mit den Klammern einzusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596904</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 12:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 12:41:53 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Da die Funktion als &quot;xxx() const&quot; definiert ist, brauch ich hier doch den const_cast um das wieder zu lockern (oder nicht?).</p>
</blockquote>
<p>Wie Nexus gesagt hat, wieso etwas verschärfen, wenn du es danach wieder lockerst, das macht doch keinen Sinn.</p>
<p>Fabeltier schrieb:</p>
<blockquote>
<p>Wozu brauche ich eine Const und eine ohne-Const Version (such das gerade nochmal im Buch, ich glaube da stand was..)</p>
</blockquote>
<p>Falls das Objekt konstant ist, sollte man nur lesen können, falls es nicht konstant ist, sollte man auch schreiben können. Darum geht es. Und camper hat wunderbar gezeigt, dass man dies über zwei Klassen erledigen kann, also eine Proxy und eine ConstProxy Klasse.<br />
Dann ist der <code>const_cast</code> nicht mehr nötig und alles funktioniert so, wie es eben sollte.</p>
<p>Fabeltier schrieb:</p>
<blockquote>
<p>Afaik ist jegliches casten ja immer eher schlecht, da es das eigentliche Konzept aufbricht, oder?!</p>
</blockquote>
<p>Ich würde es nicht schlecht bezeichnen, aber man sollte immer überlegen, wenn man castet, ob es nicht anders gehen könnte.</p>
<p>Fabeltier schrieb:</p>
<blockquote>
<p>private<br />
ja hab ich schliesslich auch gemacht.</p>
</blockquote>
<p>Jedenfalls nicht in dem uns gezeigten Beispiel.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Natürlich nicht. <code>static_cast</code> ist meistens legitim. <code>reinterpret_cast</code> ist manchmal halt nötig. <code>const_cast</code> sollte man möglichst vermeiden, und <code>dynamic_cast</code> ist zwar teilweise praktisch, wird aber von vielen als Designfehler angesehen.</p>
</blockquote>
<p>Da muss ich dir widersprechen Nexus. Bei jeglichem Cast sollte man darauf achten, ob da wirklich alles korrekt abläuft. Ich brauche seit Ewigkeiten keine Casts mehr, erst recht auch wegen dem Einsatz von Templates.<br />
Bei vielem ist es möglich ohne Casts klar zu kommen, man sollte sie wirklich nur äusserst selten verwenden und immer wenn man sie verwendet, sich überlegen, ob das nicht auch ohne gehen könnte.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596936</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 10 Oct 2008 12:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:13:03 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Natürlich nicht. <code>static_cast</code> ist meistens legitim. <code>reinterpret_cast</code> ist manchmal halt nötig. <code>const_cast</code> sollte man möglichst vermeiden, und <code>dynamic_cast</code> ist zwar teilweise praktisch, wird aber von vielen als Designfehler angesehen.</p>
</blockquote>
<p>Da muss ich dir widersprechen Nexus. Bei jeglichem Cast sollte man darauf achten, ob da wirklich alles korrekt abläuft. Ich brauche seit Ewigkeiten keine Casts mehr, erst recht auch wegen dem Einsatz von Templates.<br />
Bei vielem ist es möglich ohne Casts klar zu kommen, man sollte sie wirklich nur äusserst selten verwenden und immer wenn man sie verwendet, sich überlegen, ob das nicht auch ohne gehen könnte.</p>
</blockquote>
<p>Es ist vielleicht schon tendenziell so, dass man weniger Casts braucht, wenn man bereits länger programmiert. Zum Beispiel, weil <code>static_cast</code> hauptsächlich mit elementaren Typen verwendet wird, und man mit höherer Abstraktionsebene vielleicht weniger &quot;direkt&quot; programmiert.</p>
<p>So pauschal würde ich dennoch nicht behaupten, es sei nur gut, so wenig Casts wie möglich zu verwenden. Es gibt einige Fälle, bei denen ich Casts einsetze.</p>
<p>Nur mal ein Anfänger-Beispiel:</p>
<pre><code class="language-cpp">double e = 3.25f;
double f = 2.67f;

float i = (e + f)/2;                     // (1)
float j = static_cast&lt;float&gt;(e + f)/2.f; // (2)
</code></pre>
<p>Der Cast wäre nicht unbedingt nötig. Trotzdem würde ich ihn an dieser Stelle schreiben, da ich erstens gerade sehe, dass von <code>double</code> zu <code>float</code> umgewandelt wird und zweitens die Warnung beseitige.</p>
<p>Bei <code>dynamic_cast</code> habe ich eine ähnliche Meinung. Manchmal ist es eben recht praktisch, und für mich gibts da schlimmere Designfehler (was ist denn daran überhaupt so schlimm?). Ein Vermeiden des <code>dynamic_cast</code> s führt manchmal dazu, dass das gesamte Design geändert werden muss (ja, du wirst jetzt sagen, dass das Design schon von Anfang an schlecht war ;)).</p>
<p>Man hat z.B. eine Basisklasse <code>Base</code> , und mehrere davon abgeleitete Klassen, darunter <code>Derived</code> .</p>
<pre><code class="language-cpp">Base* Ptr;
// ...
Ptr = new Derived();
Ptr-&gt;FunctionWhichOnlyExistsInDerived();                         // geht nicht.
dynamic_cast&lt;Derived*&gt;(Ptr)-&gt;FunctionWhichOnlyExistsInDerived(); // geht.
</code></pre>
<p>Wie macht man das sonst? Ich kann mir nur noch vorstellen, eine virtuelle Funktion zu schreiben, die dann innerhalb der Klasse die richtigen Funktionen aufruft. Aber das ist auch nicht immer erwünscht, manchmal will man von aussen je nach Klasse unterschiedlich zugreifen. Ist das bereits zwingend schlechtes Design?</p>
<p>Bei <code>const_cast</code> teile ich deine Meinung uneingeschränkt, den habe ich eigentlich noch nie eingesetzt. <code>reinterpret_cast</code> kommt auch recht selten vor, und dann eher zu Testzwecken. Und es gehört für mich auch dazu, zu überprüfen, ob alles korrekt läuft, wenn ich caste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1596997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596997</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:25:53 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>[...](was ist denn daran überhaupt so schlimm?)[...]</p>
</blockquote>
<p>Grundsätzlich kann man das schon machen, aber:<br />
Der Designbruch besteht darin, dass man damit die IsA-Beziehung aufbricht. Wenn Du ein abgeleitetes Objekt einem Basisklassenzeiger/Referenz zuweist, dann willst Du eigentlich damit sagen: An dieser Stelle will ich nur die Eigenschaften haben, welche die Basisklasse hat. Wenn Du nun das Basisklassenobjekt wieder hochcastest, dann bist Du eigentlich an einer Stelle, wo es besser gewesen wäre, gleich ein abgeleitetes Objekt zu haben, und nicht über ein Basisklassenobjekt zu gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597013</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:25:53 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:30:25 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Exakt. Und das impiliziert ja, dass er zur Laufzeit bereits wissen muss, welches/e Objekte da in Frage kommen können. Das heisst, dass er vorher eine Typabfrage (in welcher Form auch immer) machen muss. Was ja schlussendlich (vom Prinzip her) auf das void gecaste zurückführt. <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/1597016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597016</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:35:16 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wenn Du nun das Basisklassenobjekt wieder hochcastest, dann bist Du eigentlich an einer Stelle, wo es besser gewesen wäre, gleich ein abgeleitetes Objekt zu haben, und nicht über ein Basisklassenobjekt zu gehen.</p>
</blockquote>
<p>Ja, aber manchmal hat man einen Basisklassenzeiger, um damit mehrere abgeleitete Klassen ansprechen zu können. Und wenn sich die einzelnen Klassen nicht nur in den Definitionen der virtuellen Funktionen unterscheiden, sondern beispielsweise noch weitere, spezifische Funktionen haben, möchte man vielleicht je nach Fall anders auf die Klasse reagieren. Und die spezifischen Eigenschaften einer Klasse kann man von aussen nur mit <code>dynamic_cast</code> modifizieren (man hat nur einen Basisklassenzeiger).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597020</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:39:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Wenn Du nun das Basisklassenobjekt wieder hochcastest, dann bist Du eigentlich an einer Stelle, wo es besser gewesen wäre, gleich ein abgeleitetes Objekt zu haben, und nicht über ein Basisklassenobjekt zu gehen.</p>
</blockquote>
<p>Ja, aber manchmal hat man einen Basisklassenzeiger, um damit mehrere abgeleitete Klassen ansprechen zu können. Und wenn sich die einzelnen Klassen nicht nur in den Definitionen der virtuellen Funktionen unterscheiden, sondern beispielsweise noch weitere, spezifische Funktionen haben, möchte man vielleicht je nach Fall anders auf die Klasse reagieren. Und die spezifischen Eigenschaften einer Klasse kann man von aussen nur mit <code>dynamic_cast</code> modifizieren (man hat nur einen Basisklassenzeiger).</p>
</blockquote>
<p>Das bringt nichts. Wie drakon schon sagte, musst Du eh wissen, welches abgeleitete Objekt Du ansprechen willst. Sowas führt meist zu Funktionen in denen dann über irgendwelche Typabfragen das richtige Objekt zurechgecastet wird, und das ist nicht gerade sehr sauber. Da macht es mehr Sinn, z.B. überladene Funktionen für die verschiedenen in Frage kommenden Klassen zu machen, die die Spezialfunktionen darin aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597024</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:40:28 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Exakt. Und das impiliziert ja, dass er zur Laufzeit bereits wissen muss, welches/e Objekte da in Frage kommen können. Das heisst, dass er vorher eine Typabfrage (in welcher Form auch immer) machen muss. Was ja schlussendlich (vom Prinzip her) auf das void gecaste zurückführt. <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>Stimmt, da hast du Recht. Wahrscheinlich wird mein Beispiel eh auf eine hässliche Fallunterscheidung hinauslaufen.</p>
<p>Was aber, wenn man von aussen (von mir aus von einer anderen Klasse) auf eine spezifische Funktion zugreifen möchte, während dort nur der Basisklassenzeiger bekannt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597025</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:42:21 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Was aber, wenn man von aussen (von mir aus von einer anderen Klasse) auf eine spezifische Funktion zugreifen möchte, während dort nur der Basisklassenzeiger bekannt ist?</p>
</blockquote>
<p>Dann hast Du ein gutes Beispiel für schlechtes Design. <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/1597027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597027</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:48:45 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nur mal ein Anfänger-Beispiel:</p>
<pre><code class="language-cpp">double e = 3.25f;
double f = 2.67f;
	
float i = (e + f)/2;                     // (1)
float j = static_cast&lt;float&gt;(e + f)/2.f; // (2)
</code></pre>
</blockquote>
<p>Und wieso nicht gleich:</p>
<pre><code class="language-cpp">double e = 3.25;
double f = 2.67;

double i = (e + f)/2.0;
double j = (e + f)/2.0;
</code></pre>
<p>Auch wenn du sagst, das sei nur ein Beispiel gewesen, aber genau darauf läuft es hinaus. Ich benutze nur ein <code>static_cast</code> , bei solchen Dingen, wenn es irgendeine Inkonsistenz zwischen zwei Bibliotheken gibt.<br />
Bei deiner eigenen Bibliothek oder Programm, sollte so eine Inkonsistenz erst gar nicht auftauchen <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>Nexus schrieb:</p>
<blockquote>
<p>Bei <code>dynamic_cast</code> habe ich eine ähnliche Meinung. Manchmal ist es eben recht praktisch, ...</p>
</blockquote>
<p>Um deine Designfehler zu behben? <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 für mich gibts da schlimmere Designfehler (was ist denn daran überhaupt so schlimm?).</p>
</blockquote>
<p>Schlimmere gibt es natürlich schon.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ein Vermeiden des <code>dynamic_cast</code> s führt manchmal dazu, dass das gesamte Design geändert werden muss (ja, du wirst jetzt sagen, dass das Design schon von Anfang an schlecht war ;)).</p>
</blockquote>
<p>Genau, es war von anfang an nicht korrekt durchdacht. Gut, da kann man dann manchmal nicht nochmals alles auf den Kopf stellen. Aber theoretisch sollte man <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>Für das Restliche, siehe Tachyons Erklärung.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ja, aber manchmal hat man einen Basisklassenzeiger, um damit mehrere abgeleitete Klassen ansprechen zu können. Und wenn sich die einzelnen Klassen nicht nur in den Definitionen der virtuellen Funktionen unterscheiden, sondern beispielsweise noch weitere, spezifische Funktionen haben, möchte man vielleicht je nach Fall anders auf die Klasse reagieren. Und die spezifischen Eigenschaften einer Klasse kann man von aussen nur mit <code>dynamic_cast</code> modifizieren (man hat nur einen Basisklassenzeiger).</p>
</blockquote>
<p>Wieso hast du nur einen Basisklassenzeiger? Wieso übergibst du nicht gleich die abgeleiteten Klassen? Du kannst ja Funktionen überladen. Allenfalls kannst du sowas machen:</p>
<pre><code class="language-cpp">class Base
{
public:
  void base_method();
};

class One : public Base
{
public:
  void one_method();
};

class Two : public Base
{
public:
  void two_method();
};

// Dein vorgehen:
void foo(Base* base)
{
  base-&gt;base_method();

  One* one = dynamic_cast&lt;One*&gt;(base);

  if(one)
  { one-&gt;one_method(); }
}

// Mein vorgehen:
void foo(Base* base)
{
  base-&gt;base_method();
}

void foo(One* one)
{
  one-&gt;base_method();
  one-&gt;one_method();
}
</code></pre>
<p>Grüssli</p>
<p>PS: SAGT MAL, WAS POSTET HIER SO SCHNELL??? Jedesmall wenn ich auf Vorschau geklickt habe, waren da 2-3 weiter Posts. Geht gefälligst arbeiten! <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/1597028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597028</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:44:44 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Das bringt nichts. Wie drakon schon sagte, musst Du eh wissen, welches abgeleitete Objekt Du ansprechen willst. Sowas führt meist zu Funktionen in denen dann über irgendwelche Typabfragen das richtige Objekt zurechgecastet wird, und das ist nicht gerade sehr sauber.</p>
</blockquote>
<p>Ja, hab ich eben auch gerade gemerkt. <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>Tachyon schrieb:</p>
<blockquote>
<p>Da macht es mehr Sinn, z.B. überladene Funktionen für die verschiedenen in Frage kommenden Klassen zu machen, die die Spezialfunktionen darin aufzurufen.</p>
</blockquote>
<p>Ja, das war ja meine Alternative 2 Posts vorher. Gibt es nicht Fälle, wo man unbedingt von aussen direkt Spezifisches ansprechen will? Weil beispielsweise die aufgerufene Methode je nach Klasse andere Parameter benötigt, was durch eine einheitliche Schnittstelle über eine virtuelle Funktion nicht zu realisieren wäre?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597029</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:51:38 GMT]]></title><description><![CDATA[<p>***** OT-Ticker *** OT-Ticker *** OT-Ticker *****</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>PS: SAGT MAL, WAS POSTET HIER SO SCHNELL??? Jedesmall wenn ich auf Vorschau geklickt habe, waren da 2-3 weiter Posts. Geht gefälligst arbeiten! <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>
</blockquote>
<p>Eigentlich müsste ich das wirklich dringend, aber ich hab hier im Moment echt gräßliches Dokuzeugs. Das ist so ätzend, da verbringt man lieber Zeit mit dem Verbeiwürgen von hartem Stuhl an schmerzenden Hämorrhoiden, als mit <em>dieser</em> Arbeit.<br />
***** OT-Ticker *** OT-Ticker *** OT-Ticker *****</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ja, das war ja meine Alternative 2 Posts vorher. Gibt es nicht Fälle, wo man unbedingt von aussen direkt Spezifisches ansprechen will? Weil beispielsweise die aufgerufene Methode je nach Klasse andere Parameter benötigt, was durch eine einheitliche Schnittstelle über eine virtuelle Funktion nicht zu realisieren wäre?</p>
</blockquote>
<p>&quot;Andere Parameter benötigen&quot; und &quot;einheitliche Schnittstelle&quot; beisst sich ja irgendwie schon, oder? <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/1597030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597030</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 14:54:11 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Um deine Designfehler zu behben? <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>
</blockquote>
<p>Ähm... Bitte keine Vorurteile. :p</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Auch wenn du sagst, das sei nur ein Beispiel gewesen, aber genau darauf läuft es hinaus.</p>
</blockquote>
<p>Grr, man findet immer etwas. <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 />
Naja, das Beispiel sollte das Prinzip erläutern, von daher läuft es nicht genau darauf hinaus. Von mir aus kann man <code>2.f</code> durch eine <code>float</code> -Variable ersetzen.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ich benutze nur ein static_cast, bei solchen Dingen, wenn es irgendeine Inkonsistenz zwischen zwei Bibliotheken gibt.</p>
</blockquote>
<p>Teilweise ist man aber auch selber gezwungen, eine Konvertierung durchzuführen (sei es auch nur, um eine Warnung zu verhindern). Oder, um die Genauigkeit des Resultats anzupassen (z.B. Division zweier Integer).</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>PS: SAGT MAL, WAS POSTET HIER SO SCHNELL??? Jedesmall wenn ich auf Vorschau geklickt habe, waren da 2-3 weiter Posts. Geht gefälligst arbeiten! <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>
</blockquote>
<p>Habe ich mich auch gefragt. Meine Antworten sind immer auf etwa zwei Posts vorher bezogen...</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>&quot;Andere Parameter benötigen&quot; und &quot;einheitliche Schnittstelle&quot; beisst sich ja irgendwie schon, oder? <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>Ja eben, deshalb ist auch die Schnittstelle unterschiedlich, wodurch ein <code>dynamic_cast</code> erforderlich ist. Ich weiss, ich habe nicht die besten Beispiele, aber so ein Fall könnte doch schon mal vorkommen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597037</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 14:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 15:01:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ja eben, deshalb ist auch die Schnittstelle unterschiedlich, wodurch ein <code>dynamic_cast</code> erforderlich ist. Ich weiss, ich habe nicht die besten Beispiele, aber so ein Fall könnte doch schon mal vorkommen...</p>
</blockquote>
<p>Das heisst, Du willst an einer Stelle eine einheitliche Schnittstelle haben. Diese ist die Basisklasse. Dann fällt Dir aber auf, dass die Schnittstelle wohl doch nicht so einheitlich sein soll, und Du castest das, was über die einheitliche Schnittstelle reinkam wieder auf nicht einheitliche, abgeleitete Objekte zurück. Dann braucht man abere eben gerade auch <strong>keine</strong> einheitliche Schnittstelle.</p>
<p>Ja, sowas kann vorkommen, aber nur wenn Du Dir vorher nicht ausreichend Gedanken dazu gemacht hast.<br />
Ich hab dynamic_cast&lt;&gt;, glaube ich, erst einmal gebraucht. Ich hatte mir nicht genug Gedanken über das Design gemacht, und einfach drauf losprogrammiert. Da war schon so viel Code zurechtgerickelt, dass ich fürs Neuschreiben einen auf den Deckel bekommen hätte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597040</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 10 Oct 2008 15:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 15:04:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ähm... Bitte keine Vorurteile. :p</p>
</blockquote>
<p>Ok, ehm ... können wir deine bisher geschriebenen Codestücke sehen? <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>Nexus schrieb:</p>
<blockquote>
<p>Grr, man findet immer etwas. <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 />
Naja, das Beispiel sollte das Prinzip erläutern, von daher läuft es nicht genau darauf hinaus. Von mir aus kann man <code>2.f</code> durch eine <code>float</code> -Variable ersetzen.</p>
</blockquote>
<p>Dann kommt die Frage, wieso diese <code>float</code> -Variable, einem <code>double</code> zugewiesen werden muss und dann später wieder einem <code>float</code> ? Wieso nicht gleich <code>float</code> bleiben oder allenfalls alles <code>double</code> machen.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Teilweise ist man aber auch selber gezwungen, eine Konvertierung durchzuführen (sei es auch nur, um eine Warnung zu verhindern). Oder, um die Genauigkeit des Resultats anzupassen (z.B. Division zweier Integer).</p>
</blockquote>
<p>** <code>static_cast</code> ist nicht dazu da Warnungen zu ignorieren!** Ich glaube das sollte man hier mal ganz wesentlich unterstreichen!</p>
<p>Und was du mit der Genauigkeit meinst, ist mir nicht ganz klar.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ich weiss, ich habe nicht die besten Beispiele, aber so ein Fall könnte doch schon mal vorkommen...</p>
</blockquote>
<p>Nein, in 99.9999999999% der Fälle, wird <code>dynamic_cast</code> verwendet um Designfehler zu umgehen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597044</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 10 Oct 2008 15:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Fri, 10 Oct 2008 15:22:31 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ok, ehm ... können wir deine bisher geschriebenen Codestücke sehen? <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>
</blockquote>
<p>Muss ich mich denn die ganze Zeit rechtfertigen? :p<br />
Ich bin noch nicht sehr erfahren bei Designfragen und lerne ständig dazu, sonst hätte ich hier wohl keine Frage gestellt.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Dann kommt die Frage, wieso diese <code>float</code> -Variable, einem <code>double</code> zugewiesen werden muss und dann später wieder einem <code>float</code> ? Wieso nicht gleich <code>float</code> bleiben oder allenfalls alles <code>double</code> machen.</p>
</blockquote>
<p>Wie gesagt, man findet immer was. Leider wollte ich vorher kein Maximalbeispiel aufschreiben, damit auch alles klar gewesen wäre. Die Variablen sind von irgendwoher gegeben, durch Parameterübergaben oder so. Und ja, man könnte das schon immer weiter zurückverfolgen, und schlussendlich sagen, man hätte es gleich mit <code>float</code> machen können. Vielleicht waren aber bis zu einem Punkt immer <code>double</code> s erforderlich, und ab da eben nur noch <code>float</code> s. Irgendwo kommt der Punkt, wo man konvertieren muss, und da finde ich den expliziten Weg oft besser, weil man eben gerade deutlich macht, was getan wird.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>** <code>static_cast</code> ist nicht dazu da Warnungen zu ignorieren!** Ich glaube das sollte man hier mal ganz wesentlich unterstreichen!</p>
</blockquote>
<p>Ja, es war vielleicht ein bisschen unglücklich ausgedrückt. Aber man benutzt <code>static_cast</code> schon auch, um dem Compiler klar zu machen, dass man sich der Konvertierung bewusst ist. Insofern benutzt man es schon, um Warnungen zu unterdrücken (mit dem Nebeneffekt, dass man durch die explizite Konvertierung auch besser sieht, was gemacht wird). Auch wenn keine Warnung generiert würde, gibt es Fälle, wo ich lieber noch ein explizites <code>static_cast</code> hinschreibe. Also nicht nur, um Warnungen zu ignorieren.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Und was du mit der Genauigkeit meinst, ist mir nicht ganz klar.</p>
</blockquote>
<p>Folgende beiden Variablen <code>i</code> und <code>j</code> sind <strong>gegeben</strong> (beispielsweise als Schleifenvariablen):</p>
<pre><code class="language-cpp">int i, j;
float div = static_cast&lt;float&gt;(i)/static_cast&lt;float&gt;(j);
</code></pre>
<p>Ich weiss, man könnte nur einen Cast benutzen, oder einfach eine <code>1.f *</code> vorne dran setzen, aber ich schreib es lieber, um es eindeutig zu erkennen.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Nein, in 99.9999999999% der Fälle, wird <code>dynamic_cast</code> verwendet um Designfehler zu umgehen.</p>
</blockquote>
<p>So? Ich dachte, es wäre selber einer? :p<br />
Aber gut, wenn man damit Designfehler umgeht, spricht ja nichts dagegen... <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/1597059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597059</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 15:22:31 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Sat, 11 Oct 2008 09:53:54 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Sry, die '&amp;' waren Schreibfehler (cpy/paste).</p>
<pre><code class="language-cpp">template&lt;class T&gt;
const typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return Matrix_2D&lt;T&gt;::Proxy(const_cast&lt; Matrix_2D&lt;T&gt;&amp; &gt;(*this), x);
}

template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
{
    return typename Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>const_cast<br />
Das ist ein Problem, das mir noch nicht 100% klar ist. Ich habe mich hier an Scott Meyers orientiert, dort werden in einem Beispiel beide Versionen der operator[]() wie oben einmal mit und einmal ohne const implementiert. Da die Funktion als &quot;xxx() const&quot; definiert ist, brauch ich hier doch den const_cast um das wieder zu lockern (oder nicht?). Wozu brauche ich eine Const und eine ohne-Const Version (such das gerade nochmal im Buch, ich glaube da stand was..) Afaik ist jegliches casten ja immer eher schlecht, da es das eigentliche Konzept aufbricht, oder?!</p>
<p>private<br />
ja hab ich schliesslich auch gemacht.</p>
<p>Danke fuer die Hinweise!</p>
</blockquote>
<p>Ich habe bereits etwas zu const-Rückgaben von Proxies gesagt, und ich habe nicht die Absicht, mich zu wiederholen.<br />
Es kann sinnvoll sein, dass eine nicht-const Memberfunktion einen const-Memberoverload aufruft, und das Ergebnis ggf. castet (auch das kann in bestimmten Fällen schiefgehen, das sind dann aber solche, in denen der wechselseitige Aufruf von vorneherein unzulässig ist); den umgekehrten Weg sollte man <em>nie</em> gehen, denn undefiniertes Verhalten ist dann vorprogrammiert, ergo</p>
<pre><code class="language-cpp">template&lt;class T&gt;
typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x)
{
    const Matrix_2D&lt;T&gt;&amp; this_const = *this;
    return this_const[x];
}

template&lt;class T&gt;
const typename Matrix_2D&lt;T&gt;::Proxy Matrix_2D&lt;T&gt;::operator[](int x) const
{
    return typename Matrix_2D&lt;T&gt;::Proxy(*this, x);
}
</code></pre>
<p>Nanu. Wir müssen gar nicht casten? Komisch, dass ich bereits erwähnt habe, dass const-Rückgabe nicht den gewünschten Zweck erfüllen kann...</p>
<p>Ein Proxie ist im Grunde so etwas wie eine Referenz in Form eines Klassenobjektes. Und so wie bei einer Referenz - die inhärent &quot;konstant&quot; ist - spielt es bei diesem Objekt keine Rolle ob es konstant ist oder nicht, um zu bestimmt, ob diese Konstanz auch auf das referenzierte Etwas zutrifft. Um das zu entscheiden benötigen wir verschiedene Refrenztypen oder eben verschiedene Proxietypen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597128</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 11 Oct 2008 09:53:54 GMT</pubDate></item><item><title><![CDATA[Reply to Innere Klasse wird bei Templatedeklaration nicht als Typ erkannt on Sat, 11 Oct 2008 01:43:56 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Und was du mit der Genauigkeit meinst, ist mir nicht ganz klar.</p>
</blockquote>
<p>Folgende beiden Variablen <code>i</code> und <code>j</code> sind <strong>gegeben</strong> (beispielsweise als Schleifenvariablen):</p>
<pre><code class="language-cpp">int i, j;
float div = static_cast&lt;float&gt;(i)/static_cast&lt;float&gt;(j);
</code></pre>
<p>Ich weiss, man könnte nur einen Cast benutzen, oder einfach eine <code>1.f *</code> vorne dran setzen, aber ich schreib es lieber, um es eindeutig zu erkennen.</p>
</blockquote>
<p>In solchen Fällen bin ich auch der Meinung, dass ein cast das einzig sinnvolle ist.<br />
Aber es gibt ja auch noch andere Fälle, wie z.B bei Farbwerten. Wenn man da halt einen schönen weichen Übergang haben will, kommt man nicht drum herum das mit float's zu lösen, da aber ein DWORD erwartet wird, muss man die Werte casten und in einen DWORD umformen. Ich persönlich übergäbe auch lieber 4 float Werte, anstattt einen DWORD, aber das ist nun halt mal gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597234</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 11 Oct 2008 01:43:56 GMT</pubDate></item></channel></rss>