<?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]]></title><description><![CDATA[<p>Hallo,<br />
mir wurde hier in der Firma gesagt, dass ich wann immer es möglich ist, Vorwärtsdeklaration nutzen soll (also in der Header-Datei kein &quot;#include KLASSE&quot; sondern nur class KLASSE;), damit beim Einbinden des Projektes keine Probleme mit dem Linker kommen (man weiß ja nie, von wem, wann und wo das Projekt wieder genutzt wird).<br />
Ok, das versteh ich, da der relative Pfad ja immer von dem Pfad des Hauptprojektes ausgeht und nicht von dem Projekt in dem man es geschrieben hat.</p>
<p>Nun habe ich aber 2 Fragen:<br />
Man kann in der Header-Datei dann nur Zeiger verwenden. Also müssen diese Objekte immer mit new angelegt werden (da sie ja das Objekt sonst nach dem der Scope - meist Konstruktor - verlassen wird, weg ist).<br />
Es heißt ja, dass man wann immer es möglich ist den stack nutzen soll. Dies ist damit aber nicht möglich.<br />
Gibt es eine Vorwärtsdeklaration mit dem ich wie gewohnt auf dem Stack anlegen kann (KLASSE a; anstelle von KLASSE* a; und im Programm a = new KLASSE(); ).</p>
<p>Zweites Problem:<br />
Ich habe in einer Klasse, die ich bis jetzt via Vorwärtsdeklaration im Header eingebunden habe, ein struct. Von diesem struct soll nun ein Objekt in meinem Projekt gespeichert werden.<br />
Also würde ich gerne in der Header Datei folgendes haben:</p>
<pre><code class="language-cpp">class KLASSE;

class CurrentProject
{
private:
	STRUCT structVonKlasse;
}
}
</code></pre>
<p>Geht natürlich nicht, da die Struktur STRUCT bei dem Beispiel nicht bekannt ist - woher soll der Kompilier wissen, dass diese in der Klasse KLASSE definiert wird. Wie kann ich das dem Kompilier noch sagen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285389/vorwärtsdeklaration</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 08:48:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285389.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Apr 2011 13:53:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorwärtsdeklaration on Tue, 19 Apr 2011 13:53:00 GMT]]></title><description><![CDATA[<p>Hallo,<br />
mir wurde hier in der Firma gesagt, dass ich wann immer es möglich ist, Vorwärtsdeklaration nutzen soll (also in der Header-Datei kein &quot;#include KLASSE&quot; sondern nur class KLASSE;), damit beim Einbinden des Projektes keine Probleme mit dem Linker kommen (man weiß ja nie, von wem, wann und wo das Projekt wieder genutzt wird).<br />
Ok, das versteh ich, da der relative Pfad ja immer von dem Pfad des Hauptprojektes ausgeht und nicht von dem Projekt in dem man es geschrieben hat.</p>
<p>Nun habe ich aber 2 Fragen:<br />
Man kann in der Header-Datei dann nur Zeiger verwenden. Also müssen diese Objekte immer mit new angelegt werden (da sie ja das Objekt sonst nach dem der Scope - meist Konstruktor - verlassen wird, weg ist).<br />
Es heißt ja, dass man wann immer es möglich ist den stack nutzen soll. Dies ist damit aber nicht möglich.<br />
Gibt es eine Vorwärtsdeklaration mit dem ich wie gewohnt auf dem Stack anlegen kann (KLASSE a; anstelle von KLASSE* a; und im Programm a = new KLASSE(); ).</p>
<p>Zweites Problem:<br />
Ich habe in einer Klasse, die ich bis jetzt via Vorwärtsdeklaration im Header eingebunden habe, ein struct. Von diesem struct soll nun ein Objekt in meinem Projekt gespeichert werden.<br />
Also würde ich gerne in der Header Datei folgendes haben:</p>
<pre><code class="language-cpp">class KLASSE;

class CurrentProject
{
private:
	STRUCT structVonKlasse;
}
}
</code></pre>
<p>Geht natürlich nicht, da die Struktur STRUCT bei dem Beispiel nicht bekannt ist - woher soll der Kompilier wissen, dass diese in der Klasse KLASSE definiert wird. Wie kann ich das dem Kompilier noch sagen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051673</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Tue, 19 Apr 2011 13:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Tue, 19 Apr 2011 14:39:13 GMT]]></title><description><![CDATA[<p>Dass man durch Vorabdeklarationen Linkerprobleme löst wäre mir neu. Es hilft aber, Abhängigkeiten zu reduzieren und damit die Compilezeit zu verkürzen.<br />
Wenn ein Member als Value und nicht als Pointer in der Klasse steht, muss der Compiler die Größe des Objektes können, damit er die Größe des umgebenden Objektes berechnen kann. Zeiger sind ja immer gleich groß (auf einer bestimmten Plattform), deshalb reicht da die Vorabdeklaration.</p>
<p>Prinzipiell würde ich nicht versuchen, IMMER mit Vorabdeklarationen zu arbeiten, sondern diese dann zu verwenden, wenn es möglich ist. Und das ist es immer dann, wenn Member nur Zeiger oder Referenzen sind, für Funktionsparameter geht es auch immer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051696</guid><dc:creator><![CDATA[Sensai_]]></dc:creator><pubDate>Tue, 19 Apr 2011 14:39:13 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Tue, 19 Apr 2011 14:53:29 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Hallo,<br />
mir wurde hier in der Firma gesagt, dass ich wann immer es möglich ist, Vorwärtsdeklaration nutzen soll (also in der Header-Datei kein &quot;#include KLASSE&quot; sondern nur class KLASSE;), damit beim Einbinden des Projektes keine Probleme mit dem Linker kommen (man weiß ja nie, von wem, wann und wo das Projekt wieder genutzt wird). Ok, das versteh ich, da der relative Pfad ja immer von dem Pfad des Hauptprojektes ausgeht und nicht von dem Projekt in dem man es geschrieben hat.</p>
</blockquote>
<p>Das klingt n bissel komisch. Deklaration einer Klasse statt per #include die Definition zu holen hat primär den Vorteil, dass eine Übersetzungseinheit von weniger Dateien abhängt. Das ist dann gut, wenn etwas geändert wird. Alles, was davon abhängt, müsste neukompiliert werden. Eine Klassen-DEKLARAtion reicht aber nicht immer aus. Daher wirst Du in einigen Fällen gezwungen sein, Dir per #include die DEFINItion der Klasse zu holen.</p>
<p>Xenya schrieb:</p>
<blockquote>
<p>Nun habe ich aber 2 Fragen:<br />
Man kann in der Header-Datei dann nur Zeiger verwenden.</p>
</blockquote>
<p>Dem Compiler ist es schnurz, WO etwas steht. #include macht einfach nur eine rohe Textersetung. Ja, für gewisse Operationen muss ein Typ vollständig bekannt sein. Bei einer Deklaration wie</p>
<pre><code class="language-cpp">class Dingsbums;
</code></pre>
<p>wird dem Compiler nur gesagt, dass es eine Klasse mit diesem Namen gibt. Der Typ ist erstmal unvollständig. C++ erlaubt es dir aber eingeschränkt mit Zeigern T* und Referenzen T&amp; zu arbeiten, wobei T unvollständig ist.</p>
<p>Xenya schrieb:</p>
<blockquote>
<p>Also müssen diese Objekte immer mit new angelegt werden (da sie ja das Objekt sonst nach dem der Scope - meist Konstruktor - verlassen wird, weg ist).<br />
Es heißt ja, dass man wann immer es möglich ist den stack nutzen soll. Dies ist damit aber nicht möglich.<br />
Gibt es eine Vorwärtsdeklaration mit dem ich wie gewohnt auf dem Stack anlegen kann (KLASSE a; anstelle von KLASSE* a; und im Programm a = new KLASSE(); ).</p>
</blockquote>
<p>Gibt es nicht. Und &quot;new KLASSE()&quot; funktioniert auch nicht, wenn KLASSE unvollständig ist.</p>
<p>Xenya schrieb:</p>
<blockquote>
<p>Zweites Problem:<br />
Ich habe in einer Klasse, die ich bis jetzt via Vorwärtsdeklaration im Header eingebunden habe, ein struct. Von diesem struct soll nun ein Objekt in meinem Projekt gespeichert werden.<br />
Also würde ich gerne in der Header Datei folgendes haben:</p>
<pre><code class="language-cpp">class KLASSE;

class CurrentProject
{
private:
	STRUCT structVonKlasse;
}
}
</code></pre>
<p>Geht natürlich nicht, da die Struktur STRUCT bei dem Beispiel nicht bekannt ist - woher soll der Kompilier wissen, dass diese in der Klasse KLASSE definiert wird. Wie kann ich das dem Kompilier noch sagen?</p>
</blockquote>
<p>Gar nicht. Die Definition von KLASSE muss bekannt sein, so dass KLASSE::STRUCT als Typ nutzbar ist. STRUCT darf eh nicht unvollständig sein, wenn Du diesen Typ für ein Datenelement un CurrentProject verwenden willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051699</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 19 Apr 2011 14:53:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Tue, 19 Apr 2011 14:58:53 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Hallo,<br />
mir wurde hier in der Firma gesagt, dass ich wann immer es möglich ist, Vorwärtsdeklaration nutzen soll (also in der Header-Datei kein &quot;#include KLASSE&quot; sondern nur class KLASSE;), damit beim Einbinden des Projektes keine Probleme mit dem Linker kommen (man weiß ja nie, von wem, wann und wo das Projekt wieder genutzt wird).<br />
Ok, das versteh ich, da der relative Pfad ja immer von dem Pfad des Hauptprojektes ausgeht und nicht von dem Projekt in dem man es geschrieben hat.</p>
</blockquote>
<p>Bullshit. Der Linker hat erst mal gar nichts zu tun, der Compiler braucht aber die Bezeichner, um klarzukommen (deshalb reicht in einer Deklaration für eine DLL ja auch nur der Rückgabetyp, die Konvention, der Name, die Parameter und der Verweis, dass die Funktion ihre Definition von außen bekommt). Wieso bringen die Linker und Compiler durcheinander, das sind zwei voneinander unabhängige Programme ...</p>
<p>Xenya schrieb:</p>
<blockquote>
<p>Nun habe ich aber 2 Fragen:<br />
Man kann in der Header-Datei dann nur Zeiger verwenden. Also müssen diese Objekte immer mit new angelegt werden (da sie ja das Objekt sonst nach dem der Scope - meist Konstruktor - verlassen wird, weg ist).<br />
Es heißt ja, dass man wann immer es möglich ist den stack nutzen soll. Dies ist damit aber nicht möglich.</p>
</blockquote>
<p>1. Du kannst auch auf Objekte auf dem Stack zeigen, wenn du lustig bist. Musst nur das Design ein bisschen verändern:</p>
<pre><code class="language-cpp">class B;
class A
{
public:
    A(B*pPointer)
    {
        Pointer=pPointer;
        //Machen wir noch einen kleinen Scherz, lassen wir die Objekte
        //auf den jeweils anderen zeigen.
        pPointer-&gt;Pointer=this;
    }
private:
    B*Pointer;
};

class B
{
public:
    //Kein A-Objekt zum ERSTELLEN notwendig.
    A*Pointer
};

int main()
{
    B MyB;
    A MyA(&amp;B);//Adresse von Objekt auf dem Stack
    return 0;
}
</code></pre>
<p>2. Den Heap sollte man nicht grundsätzlich meiden. Manche Sachen lassen sich eben nur mit dynamischer Speicherverwaltung realisieren.</p>
<p>Was bringen die euch eigentlich bei?</p>
<p>Xenya schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class KLASSE;

class CurrentProject
{
private:
	STRUCT structVonKlasse;
}
}
</code></pre>
<p>Geht natürlich nicht, da die Struktur STRUCT bei dem Beispiel nicht bekannt ist - woher soll der Kompilier wissen, dass diese in der Klasse KLASSE definiert wird. Wie kann ich das dem Kompilier noch sagen?</p>
</blockquote>
<pre><code class="language-cpp">class A;
class B
{
     //Zeiger
     A*Pointer;
};

class A
{
     //Objekt
     B Object;
};
</code></pre>
<p>Nix zu danken!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051702</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Tue, 19 Apr 2011 14:58:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Tue, 19 Apr 2011 15:01:39 GMT]]></title><description><![CDATA[<p>Glühbirne schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class A;
class B
{
     //Zeiger
     A*Pointer;
};

class A
{
     //Objekt
     B Object;
};
</code></pre>
<p>Nix zu danken!</p>
</blockquote>
<p>Sehe gerade, ist selbst Bullshit, was ich geschrieben habe.</p>
<p>Es ist nicht möglich, auf einen noch nicht deklarierten Typ zuzugreifen - wo kämen wir denn da hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051705</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Tue, 19 Apr 2011 15:01:39 GMT</pubDate></item></channel></rss>