<?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[Vorwärtsdeklaration von Typdefs?]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein bisschen komisches Problem, hoffe ihr versteht meine Erklärung.<br />
Ich erkläre es beispielhaft, so dass das wichtigste raus kommt.</p>
<p>Ich habe folgende Klasse die nicht von mir ist, die ich aber verwenden will:</p>
<pre><code class="language-cpp">namespace bsp
{
	typedef weitereKlasseImNamespace td;

	class klasse
	{
		td getSpecialInformations();

		td getAllInformations();
	}
]
</code></pre>
<p>Die <em>weitereKlasseImNamespace</em> hat zwar einen Zuweisungs-Kontruktor aber einen =-Operator.</p>
<p>Deshalb geht</p>
<pre><code class="language-cpp">td temp = getAllInformations();
</code></pre>
<p>aber bei folgenden streikt der Konstruktor:</p>
<pre><code class="language-cpp">td temp;
temp = getAllInformations();
</code></pre>
<p>Nun habe ich das Problem, dass eine Flag anzeigt ob ich alle Informationen will oder die speziellen. Danach geht die Bearbeitung exakt gleich weiter.<br />
Deshalb wollte ich mir sowas bauen:</p>
<pre><code class="language-cpp">td temp = (flag)? getAllInformations() : getSpecialInformations();
</code></pre>
<p>Das geht leider nicht, da es der Kompilier so umbaut, dass er vorher das temp anlegt und danach per = Operator zuweist.</p>
<p>Ich habe das damals gelöst, in dem ich den rechten Teil in eine Methode geschrieben habe, so:</p>
<pre><code class="language-cpp">{
	td temp = getInformations(flag);
	...
}

td getInformations(bool flag)
{
	if(flag)
		getAllInformations();
	else
		getSpecialInformations();
}
</code></pre>
<p>Nun wollte ich meine gesamtes Projekt so umbauen, dass der der meine Klasse die ich baue total unabhängig von der &quot;fremden Klasse&quot; (die ich oben mit dem namespace bsp skizziert habe) laufen kann, so dass er von dieser &quot;fremden Klasse&quot; nichts wissen muss.</p>
<p>Dazu habe ich in der Header-Datei alle Klassen die davon vorkommen per vorwärts Deklaration definiert und in der cpp dann erst eingebunden.<br />
Das klappt soweit echt gut. Probleme macht nur die Methode <em>td getInformations(bool flag)</em>. Diese ist ja in der Header-Datei auch definiert. Aber da td eine typedefinition ist, kann ich es nicht vorwärtsdeklarieren - oder geht das? Das wäre toll!!</p>
<p>Wie würdet ihr das Problem lösen?</p>
<p>Eine Möglichkeit die mir einfällt ist, sie aus der .h Datei zu nehmen und in der cpp über seinem Einsatzort zu implementieren. Wirklich schön ist es aber auch net, wenn dann eine Methde nicht in der Header-Datei vorkommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288041/vorwärtsdeklaration-von-typdefs</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 11:18:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288041.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Jun 2011 11:56:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 11:56:22 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein bisschen komisches Problem, hoffe ihr versteht meine Erklärung.<br />
Ich erkläre es beispielhaft, so dass das wichtigste raus kommt.</p>
<p>Ich habe folgende Klasse die nicht von mir ist, die ich aber verwenden will:</p>
<pre><code class="language-cpp">namespace bsp
{
	typedef weitereKlasseImNamespace td;

	class klasse
	{
		td getSpecialInformations();

		td getAllInformations();
	}
]
</code></pre>
<p>Die <em>weitereKlasseImNamespace</em> hat zwar einen Zuweisungs-Kontruktor aber einen =-Operator.</p>
<p>Deshalb geht</p>
<pre><code class="language-cpp">td temp = getAllInformations();
</code></pre>
<p>aber bei folgenden streikt der Konstruktor:</p>
<pre><code class="language-cpp">td temp;
temp = getAllInformations();
</code></pre>
<p>Nun habe ich das Problem, dass eine Flag anzeigt ob ich alle Informationen will oder die speziellen. Danach geht die Bearbeitung exakt gleich weiter.<br />
Deshalb wollte ich mir sowas bauen:</p>
<pre><code class="language-cpp">td temp = (flag)? getAllInformations() : getSpecialInformations();
</code></pre>
<p>Das geht leider nicht, da es der Kompilier so umbaut, dass er vorher das temp anlegt und danach per = Operator zuweist.</p>
<p>Ich habe das damals gelöst, in dem ich den rechten Teil in eine Methode geschrieben habe, so:</p>
<pre><code class="language-cpp">{
	td temp = getInformations(flag);
	...
}

td getInformations(bool flag)
{
	if(flag)
		getAllInformations();
	else
		getSpecialInformations();
}
</code></pre>
<p>Nun wollte ich meine gesamtes Projekt so umbauen, dass der der meine Klasse die ich baue total unabhängig von der &quot;fremden Klasse&quot; (die ich oben mit dem namespace bsp skizziert habe) laufen kann, so dass er von dieser &quot;fremden Klasse&quot; nichts wissen muss.</p>
<p>Dazu habe ich in der Header-Datei alle Klassen die davon vorkommen per vorwärts Deklaration definiert und in der cpp dann erst eingebunden.<br />
Das klappt soweit echt gut. Probleme macht nur die Methode <em>td getInformations(bool flag)</em>. Diese ist ja in der Header-Datei auch definiert. Aber da td eine typedefinition ist, kann ich es nicht vorwärtsdeklarieren - oder geht das? Das wäre toll!!</p>
<p>Wie würdet ihr das Problem lösen?</p>
<p>Eine Möglichkeit die mir einfällt ist, sie aus der .h Datei zu nehmen und in der cpp über seinem Einsatzort zu implementieren. Wirklich schön ist es aber auch net, wenn dann eine Methde nicht in der Header-Datei vorkommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075664</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Thu, 09 Jun 2011 11:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 12:02:37 GMT]]></title><description><![CDATA[<p>Ach, so hab ichs auch noch probiert:</p>
<pre><code class="language-cpp">td&amp; temp = (flag)? getAllInformations() : getSpecialInformations();
</code></pre>
<p>Kompilieren lässt es sich aber es kommt ein nichts aussagender Laufzeitfehler (nur Expression: 0)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075671</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Thu, 09 Jun 2011 12:02:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 12:17:05 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Wirklich schön ist es aber auch net, wenn dann eine Methde nicht in der Header-Datei vorkommt.</p>
</blockquote>
<p>Wenn du die Methode nur in der cpp brauchst, ist das im Gegenteil nicht besonders schön, wenn sie im Header auftaucht. Das schafft nur unnötige Compilezeit- Abhängigkeiten.<br />
Typedef-forward-decl gibts leider (noch?) nicht.</p>
<p>(Weiß jemand wie das in C++0x aussieht? bin grad zu faul nachzuschauen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075683</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 09 Jun 2011 12:17:05 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 12:30:20 GMT]]></title><description><![CDATA[<p>Danke für die Antwort</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Xenya schrieb:</p>
<blockquote>
<p>Wirklich schön ist es aber auch net, wenn dann eine Methde nicht in der Header-Datei vorkommt.</p>
</blockquote>
<p>Wenn du die Methode nur in der cpp brauchst, ist das im Gegenteil nicht besonders schön, wenn sie im Header auftaucht. Das schafft nur unnötige Compilezeit- Abhängigkeiten.<br />
Typedef-forward-decl gibts leider (noch?) nicht.</p>
<p>(Weiß jemand wie das in C++0x aussieht? bin grad zu faul nachzuschauen)</p>
</blockquote>
<p>Das heißt umgekehrt, dass eigentlich alle privaten-Methoden aus der .h-Datei raus geworfen werden müssten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075691</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Thu, 09 Jun 2011 12:30:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 16:55:25 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Deshalb wollte ich mir sowas bauen:</p>
<pre><code class="language-cpp">td temp = (flag)? getAllInformations() : getSpecialInformations();
</code></pre>
<p>Das geht leider nicht, da es der Kompilier so umbaut, dass er vorher das temp anlegt und danach per = Operator zuweist.</p>
</blockquote>
<p>Das tut er nicht. Rechts des Zuweisungsoperators steht ein Ausdruck, der als Initialisierung für das Objekt <code>temp</code> verwendet wird. Weder Defaultkonstruktor noch Zuweisungsoperator werden dazu aufgerufen. Der Compiler kann jedoch auswählen, ob er dazu den Kopierkonstruktor aufruft oder gleich <code>temp</code> damit konstruiert.</p>
<p>Xenya schrieb:</p>
<blockquote>
<p>Probleme macht nur die Methode td getInformations(bool flag). Diese ist ja in der Header-Datei auch definiert. Aber da td eine typedefinition ist, kann ich es nicht vorwärtsdeklarieren - oder geht das? Das wäre toll!!</p>
</blockquote>
<p>Wenn <code>td</code> eine Klasse ist, reicht eine normale Vorwärtsdeklaration im richtigen Namensraum:</p>
<pre><code class="language-cpp">class td;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2075880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075880</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 09 Jun 2011 16:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 16:59:27 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Deshalb wollte ich mir sowas bauen:</p>
<pre><code class="language-cpp">td temp = (flag)? getAllInformations() : getSpecialInformations();
</code></pre>
<p>Das geht leider nicht, da es der Kompilier so umbaut, dass er vorher das temp anlegt und danach per = Operator zuweist.</p>
</blockquote>
<p>Vielleicht geht</p>
<pre><code class="language-cpp">td temp = (flag?getAllInformations:getSpecialInformations)();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2075884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075884</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 09 Jun 2011 16:59:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 09 Jun 2011 17:02:20 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Typedef-forward-decl gibts leider (noch?) nicht.</p>
<p>(Weiß jemand wie das in C++0x aussieht? bin grad zu faul nachzuschauen)</p>
</blockquote>
<p>Ich glaube kaum, dass es das geben wird, schliesslich gibt man dadurch Typsicherheit auf.</p>
<pre><code class="language-cpp">// Header.hpp
typedef X;

// A.cpp
#include &quot;Header.hpp&quot;
enum X {};

// B.cpp
#include &quot;Header.hpp&quot;
class X {};
</code></pre>
<p>Was soll <code>X</code> nun sein? Und wie wird es erst bei Templates? Gegeben, wir hätten nur den Header, wäre</p>
<pre><code class="language-cpp">X*
</code></pre>
<p>ein gültiger Typ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075886</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Fri, 10 Jun 2011 07:49:53 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten.</p>
<p>Die Umsetzungsvorschläge habe ich (leider mit wenig Erfolg) probiert.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Vielleicht geht</p>
<pre><code class="language-cpp">td temp = (flag?getAllInformations:getSpecialInformations)();
</code></pre>
</blockquote>
<p>Nein geht leider nicht.<br />
error C2064: Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Wenn <code>td</code> eine Klasse ist, reicht eine normale Vorwärtsdeklaration im richtigen Namensraum:</p>
<pre><code class="language-cpp">class td;
</code></pre>
</blockquote>
<p>td ist ein solches Konstrukt:</p>
<pre><code class="language-cpp">tyedef KlasseImNameSpaceBsp&lt;NochEineKlasseImNamespaceBsp&gt; td
</code></pre>
<p>Wenn ich <em>class td;</em> angebe kommt<br />
error C2371: 'Bsp::td': Neudefinition; unterschiedliche Basistypen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076173</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Fri, 10 Jun 2011 07:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Fri, 10 Jun 2011 08:27:20 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Das heißt umgekehrt, dass eigentlich alle privaten-Methoden aus der .h-Datei raus geworfen werden müssten?</p>
</blockquote>
<p>Wenn sie nicht auf die Klassenvariablen zugreifen müssen oder virtuell sind, um überschrieben zu werden, wäre das durchaus machbar und wünschenswert.</p>
<p>Das macht sich vor allem in größeren projekten bezahlt, und wenn die Klasse an vielen stellen benutzt wird:</p>
<p>Jeder Änderung im Header führt dazu, dass alle Sourcen, die den Header einbinden, neu compiliert werden müssen. Das kann man reduzieren, wenn man Funktionen, die nicht auf die privaten Elemente der Klasse zugreifen müssen, auch nicht als Klassenmethoden, sondern als freie Funktionen in der .cpp deklariert.<br />
Für ganz extreme Fälle gibt es das &quot;pimpl&quot;-Idiom: die einzig privaten Elemente der Klasse sind ein inneres struct/Klasse (häufig XYZImpl genannt) und ein Pointer darauf (noch häufiger pImpl genannt, daher der Name pimpl-Idiom).<br />
Das struct wird in der .cpp definiert, alle Daten finden sich darin, und alle Methoden werden über Aktionen auf diesem struct definiert.</p>
<p>Lektüre:<br />
<a href="http://www.gotw.ca/gotw/007.htm" rel="nofollow">http://www.gotw.ca/gotw/007.htm</a><br />
<a href="http://www.gotw.ca/gotw/024.htm" rel="nofollow">http://www.gotw.ca/gotw/024.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076186</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 10 Jun 2011 08:27:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Fri, 10 Jun 2011 10:29:22 GMT]]></title><description><![CDATA[<p>super Danke für Erklärung.</p>
<p>Schau mir deine Lektüre-Tipps auch noch an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076236</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Fri, 10 Jun 2011 10:29:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Fri, 10 Jun 2011 11:48:20 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>td ist ein solches Konstrukt:</p>
<pre><code class="language-cpp">tyedef KlasseImNameSpaceBsp&lt;NochEineKlasseImNamespaceBsp&gt; td
</code></pre>
<p>Wenn ich <em>class td;</em> angebe kommt<br />
error C2371: 'Bsp::td': Neudefinition; unterschiedliche Basistypen</p>
</blockquote>
<p>Von Templates hast du nichts gesagt. Dann müsstest du erst das Template deklarieren und dann die Instanziierung als <code>typedef</code> (vorausgesetzt <code>MyClass</code> ist bereits deklariert):</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Template;

typedef Template&lt;MyClass&gt; td;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2076289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076289</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Jun 2011 11:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Fri, 10 Jun 2011 12:05:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>(vorausgesetzt <code>MyClass</code> ist bereits deklariert):</p>
</blockquote>
<p>Mit Betonung auf deklariert:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Template;

class MyClass;
typedef Template&lt;MyClass&gt; td;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2076300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076300</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 10 Jun 2011 12:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration von Typdefs? on Thu, 16 Jun 2011 07:45:39 GMT]]></title><description><![CDATA[<p>oh, ich sah erst jetzt, dass ihr nochmals geantwortet habt.</p>
<p>Vielen lieben Dank für eure Mühen.</p>
<p>ich habe das gleich mal probiert und es funktioniert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2078890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078890</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Thu, 16 Jun 2011 07:45:39 GMT</pubDate></item></channel></rss>