<?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[Nutzund der Forward declaration im header?]]></title><description><![CDATA[<p>Ich hab eine header datei, die mit forward declarations arbeitet. in dieser header datei wird eine klasse mit einer pure virtual methode dklariert und ein paar zeilen später wird diese in der gleichen datei implementiert</p>
<p>Der Stil ist ungefähr:</p>
<pre><code class="language-cpp">// foo.h
class FClass;

class IMyClass
{
  public: 
    virtual void tuwas() = 0;
};

template&lt;class T&gt;
class MyClass : public IMyclass
{
  public:
    virtual void tuwas();
};

#include &quot;FClassImpl.h&quot;

template&lt;class T&gt;
void MyClass::update()
{
    for (std::vector&lt;FClass*&gt;::iterator it =  obsList.begin(); it != obsList.end(); it++)
     { (*it)-&gt;update(); }
}
</code></pre>
<p>Die FclassImpl sieht so aus:</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot; // &lt;--- das Problem???

class FClass
{
  public:
     virtual void update() = 0;
};

// dann die konkrete klasse und implementation der update methode
</code></pre>
<p>Das kompiliert unter windows, aber make wirft mir folgendes an den<br />
kopf:</p>
<blockquote>
<p>/Ma/foo.h: In member function ‘virtual void MyClass&lt;T&gt;::update()’:<br />
/Ma/foo.h:117: error: invalid use of incomplete type ‘struct FClass’<br />
/Ma/foo.h:45: error: forward declaration of ‘struct FClass’</p>
</blockquote>
<p>Mir ist auch nicht klar, warum er davon ausgeht, dass es ein struct und keine klasse ist.</p>
<p>Was kann hier das problem sein?<br />
(Ich hab natürlich die vector deklaration usw weggelassen hier)<br />
Ich include ja auch den header mit der definition und implementation und allem, daher müsste er doch zur kompilierzeit alles auflösen können</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242577/nutzund-der-forward-declaration-im-header</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 23:03:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242577.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Jun 2009 12:08:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:21:47 GMT]]></title><description><![CDATA[<p>Ich hab eine header datei, die mit forward declarations arbeitet. in dieser header datei wird eine klasse mit einer pure virtual methode dklariert und ein paar zeilen später wird diese in der gleichen datei implementiert</p>
<p>Der Stil ist ungefähr:</p>
<pre><code class="language-cpp">// foo.h
class FClass;

class IMyClass
{
  public: 
    virtual void tuwas() = 0;
};

template&lt;class T&gt;
class MyClass : public IMyclass
{
  public:
    virtual void tuwas();
};

#include &quot;FClassImpl.h&quot;

template&lt;class T&gt;
void MyClass::update()
{
    for (std::vector&lt;FClass*&gt;::iterator it =  obsList.begin(); it != obsList.end(); it++)
     { (*it)-&gt;update(); }
}
</code></pre>
<p>Die FclassImpl sieht so aus:</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot; // &lt;--- das Problem???

class FClass
{
  public:
     virtual void update() = 0;
};

// dann die konkrete klasse und implementation der update methode
</code></pre>
<p>Das kompiliert unter windows, aber make wirft mir folgendes an den<br />
kopf:</p>
<blockquote>
<p>/Ma/foo.h: In member function ‘virtual void MyClass&lt;T&gt;::update()’:<br />
/Ma/foo.h:117: error: invalid use of incomplete type ‘struct FClass’<br />
/Ma/foo.h:45: error: forward declaration of ‘struct FClass’</p>
</blockquote>
<p>Mir ist auch nicht klar, warum er davon ausgeht, dass es ein struct und keine klasse ist.</p>
<p>Was kann hier das problem sein?<br />
(Ich hab natürlich die vector deklaration usw weggelassen hier)<br />
Ich include ja auch den header mit der definition und implementation und allem, daher müsste er doch zur kompilierzeit alles auflösen können</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721719</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:18:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">(*it)-&gt;update();
</code></pre>
<p>Ist sowas wie:</p>
<pre><code class="language-cpp">FClass-&gt;update();
</code></pre>
<p>Nun kennt er FClass aber nicht und weiss auch nicht, dass diese Klasse eine Methode update hat. Woher auch? Mit Forwarddeklarationen von Typen kann man nur arbeiten, falls man nur Zeiger oder Referenzen benutzt. Du hingegen rufst sogar Methoden auf. Abhilfe sollte ein Include des entsprechenden Headers von FClass schaffen. Zwar hast du die im Code angegeben, doch solltest du nochmal auf Gross- und Kleinschreibung achten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721722</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:16:51 GMT]]></title><description><![CDATA[<blockquote>
<p>Mir ist auch nicht klar, warum er davon ausgeht, dass es ein struct und keine klasse ist.</p>
</blockquote>
<p>Ein <code>struct</code> ist eine Klasse. Die Member sind einfach von Haus aus <code>public</code> .</p>
<p>Probier doch bitte den Code auf ein lauffähiges Beispiel runterzubrechen, bei dem der selbe Fehler geschieht. Ohne die genauen Implementierungen zu kennen wird es schwer..</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a>:<br />
Ich dachte auch, dass es das ist, allerdings scheint er die Implementierung ja zu inkludieren:</p>
<pre><code class="language-cpp">#include &quot;FClassImpl.h&quot;
</code></pre>
<p>Könnte theoretisch natürlich auch etwas anderes sein. Darum habe ich nochmal nachgefragt..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721723</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:23:42 GMT]]></title><description><![CDATA[<p>Ich habe es gesehen, aber ich dachte: Warum sollte in FClassImpl denn das Interface fuer FClass drin stehen, wenn FClass doch ein Interface und in FClassImpl dessen Implemetation sein soll (auch wuerde der Compiler dann nicht meckern).</p>
<p>Ach ja: Includeguards wirken manchmal Wunder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721731</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:24:33 GMT]]></title><description><![CDATA[<p>Es gibt nen include guard, der verhindert, das diese sich gegenseitig ständig includen, daher irre ich mich wohl wegen der zirkulären referenz.<br />
Ich muss mal gucken, was ich da machen kann.</p>
<p>Ich versuch was zu bauen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721732</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:28:19 GMT]]></title><description><![CDATA[<p>Hmm. Da wurde ja ein paar mal bearbeitet. :p</p>
<p>Naja. Ich würde dir raten einmal das ganze so einfach wie möglich darzustellen. Ich habe irgendwie das Gefühl, dass du selber nicht so genau weisst, wie da die Abhängigkeiten sein sollen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1721734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721734</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:28:19 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:41:54 GMT]]></title><description><![CDATA[<p>Hier ist kompilierbarer code:</p>
<pre><code class="language-cpp">// foo.h

#ifndef foo
#define foo

#include &lt;vector&gt;

class FClass;

class IMyClass
{
  public:
    virtual void tuwas() = 0;
};

class MyClass : public IMyClass
{
  public:
    virtual void tuwas();
    std::vector&lt;FClass*&gt; obsList;
};

#include &quot;FClassImp.h&quot;

void MyClass::tuwas()
{
    for (std::vector&lt;FClass*&gt;::iterator it =  obsList.begin(); it != obsList.end(); it++)
     { (*it)-&gt;update(); }
}

#endif
</code></pre>
<pre><code class="language-cpp">//FClassImp.h
#ifndef FClassImpl
#define FClassImpl

#include &quot;foo.h&quot;

class IFClass
{
  public:
    virtual void update() = 0;
};

class FClass : public IFClass
{
  public:
    virtual void update()
    {
       // tu was
    }
};

#endif
</code></pre>
<pre><code class="language-cpp">//main.cpp
#include &lt;iostream&gt;

using namespace std;
#include &quot;FClassImp.h&quot;
#include &quot;foo.h&quot;

int main()
{
    MyClass m;
    cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Das problem ist die include reihenfolge.</p>
<p>Nun ist es mir wenigstens klar, wo das problem ist. aber komisch, das visual studio das egal ist, und gcc nicht. nun ja, jetzt heißt es include suchen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721738</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to Nutzund der Forward declaration im header? on Fri, 05 Jun 2009 12:46:37 GMT]]></title><description><![CDATA[<p>1.) Warum includierst du foo.h in FClassImpl.h?<br />
2.) #include sollte meist am Anfang der Datei stehen, dann hat man einen besseren Ueberblick, was dieses Modul/Uebersetzungseinheit fuer Abhaengigkeiten hat. Auch faellt auf, dass du dann die Forwarddeklaration von FClass in foo.h nicht brauchst, da du sowieso das #include mit der kompletten Klassenbeschreibung spaeter benoetigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1721739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1721739</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 05 Jun 2009 12:46:37 GMT</pubDate></item></channel></rss>