<?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[Problem bei der Deklaration von Klassen]]></title><description><![CDATA[<p>Hallo, ich bin eher in der Java-Ecke beheimatet und habe ein Problem bei der Deklaration der folgenden C++ Klassen:</p>
<pre><code class="language-cpp">class Test1 {
  public:
    void doSomething(Test2 o);
};

class Test2 {
  public:
    virtual void updateSomething(Test1 o);
};
</code></pre>
<p>Der Compiler meldet (verständlicherweise), dass Test2 bei der Deklaration der Methode doSomething noch nicht deklariert sei. Wie kann ich das umgehen?</p>
<p>Das Ziel wäre eigentlich, Test2 wie ein Interface in Java zu verwenden.</p>
<p>Danke für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241607/problem-bei-der-deklaration-von-klassen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 07:47:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241607.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 May 2009 06:42:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 06:42:45 GMT]]></title><description><![CDATA[<p>Hallo, ich bin eher in der Java-Ecke beheimatet und habe ein Problem bei der Deklaration der folgenden C++ Klassen:</p>
<pre><code class="language-cpp">class Test1 {
  public:
    void doSomething(Test2 o);
};

class Test2 {
  public:
    virtual void updateSomething(Test1 o);
};
</code></pre>
<p>Der Compiler meldet (verständlicherweise), dass Test2 bei der Deklaration der Methode doSomething noch nicht deklariert sei. Wie kann ich das umgehen?</p>
<p>Das Ziel wäre eigentlich, Test2 wie ein Interface in Java zu verwenden.</p>
<p>Danke für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714486</guid><dc:creator><![CDATA[jaron]]></dc:creator><pubDate>Sat, 23 May 2009 06:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 07:23:56 GMT]]></title><description><![CDATA[<p>Forward Deklaration.</p>
<pre><code class="language-cpp">class Test2;//&lt;----

class Test1 {
  public:
    void doSomething(Test2 o);
};

class Test2 {
  public:
    virtual void updateSomething(Test1 o);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1714489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714489</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 23 May 2009 07:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 10:06:40 GMT]]></title><description><![CDATA[<p>Firefighter schrieb:</p>
<blockquote>
<p>Forward Deklaration.</p>
</blockquote>
<p>Bringt dir nichts, wenn er ein ganzes Objekt übergeben will. Forward Deklaration hilft nur bei Zeigern und Referenzen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21497">@jaron</a>,<br />
Dafür gibt es grundsätzlich keine Lösung, ausser du schreibst die Signatur der Funktion ein wenig um und teilst Definition und Deklaration der Klassen auf. Also ca. so:<br />
<strong>Test1.hpp</strong></p>
<pre><code class="language-cpp">#ifndef INCLUDE_GUARD_TEST1
#define INCLUDE_GUARD_TEST1

class Test2; // &lt;- forward declaration

class Test1 {
  public:
    void doSomething(Test2 const&amp; o); // eine Referenz auf ein konstantes Objekt übergeben,
                                      // die Kopie wird in der Definition durchgeführt.
};

#endif // INCLUDE_GUARD_TEST1
</code></pre>
<p><strong>Test1.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;Test1.hpp&quot;
#include &quot;Test2.hpp&quot;

void Test1::doSomething(Test2 const&amp; o)
{
  // mach was damit, oder erstell eine Kopie:
  Test2 copy = o;
}
</code></pre>
<p><strong>Test2.hpp</strong></p>
<pre><code class="language-cpp">#ifndef INCLUDE_GUARD_TEST2
#define INCLUDE_GUARD_TEST2

#include &quot;Test1.hpp&quot;

class Test2 {
  public:
    virtual void updateSomething(Test1 o);
};

#endif // INCLUDE_GUARD_TEST2
</code></pre>
<p><strong>Test2.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;Test2.hpp&quot;

void Test2::updateSomething(Test1 o)
{
  // ...
}
</code></pre>
<p>Das ganze dann natürlich über Makefile &amp; Linker zusammenfügen. Wenn du eine vernünftige IDE hast, geschieht dies automatisch.</p>
<p>Referenzen auf konstante Objekte zu übergeben ist meistens sehr praktisch, vor allem wenn das Objekt gross ist. Somit wird eine unnötige Kopie vermieden, wenn sie nicht benötigt wird.</p>
<p>Stichwörter welche du dir anschauen solltest:<br />
- Include Guards<br />
- Forward Declaration<br />
- Const correctness</p>
<p>Und noch ein Tipp:<br />
Probier unter C++ nicht Java zu programmieren. C++ und Java sind komplett verschiedene Sprachen. Nicht mal die Syntax stimmt wirklich ganz überein. Mit Java Lösungen ist man in C++ schlecht bedient, man löst Probleme anders.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714530</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 23 May 2009 10:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 10:36:45 GMT]]></title><description><![CDATA[<p>Nur bei Zeigern und Referenzen? Ok war mir nicht bekannt, danke für die Ergänzung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714532</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 23 May 2009 10:36:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 11:18:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Bringt dir nichts, wenn er ein ganzes Objekt übergeben will. Forward Deklaration hilft nur bei Zeigern und Referenzen.</p>
</blockquote>
<p>Nope. Weit verbreiteter Irrtum. Das geht.</p>
<pre><code class="language-cpp">class A;

class foo
{
public:
	A bar ( A a );
};

class A
{
};

A foo::bar ( A a)
{ return a; }

int main ()
{	
	foo f;
	A a;

	f.bar ( a );
}
</code></pre>
<p>Kein Problem. Wie man sieht, geht es auch mit dem Rückgabewert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714550</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 23 May 2009 11:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 12:40:05 GMT]]></title><description><![CDATA[<p>Wo es nicht geht, ist bei Membervariablen, weil dort die Grösse des Objekts bei der Deklaration bekannt sein muss und deshalb eine Vorwärtsdeklaration nicht ausreicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714575</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 23 May 2009 12:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 13:05:43 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Wo es nicht geht, ist bei Membervariablen, weil dort die Grösse des Objekts bei der Deklaration bekannt sein muss und deshalb eine Vorwärtsdeklaration nicht ausreicht.</p>
</blockquote>
<p>Und Vererbung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714580</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 23 May 2009 13:05:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sat, 23 May 2009 21:40:13 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.</p>
<p>Wie bereits erwähnt, hat die in der ersten Antwort erwähnte Forward Declaration funktioniert.</p>
<p>Nach einer sehr langen Absenz taste ich mich langsam wieder an C++ heran. Da es sich um die Programmierung eines Arduino (Mikrocontroller) handelt, verfüge ich nicht über den ganzen Sprachumfang von C++ und es ist mir auch klar, dass mein Code weder effizient noch C++ konform ist. Ich arbeite daran. Schritt für Schritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714753</guid><dc:creator><![CDATA[jaron]]></dc:creator><pubDate>Sat, 23 May 2009 21:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Sun, 24 May 2009 16:15:57 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>...Bringt dir nichts, wenn er ein ganzes Objekt übergeben will...</p>
</blockquote>
<p>Glaube ich gar nicht al, denn er schrieb:</p>
<p>jaron schrieb:</p>
<blockquote>
<p>...ich bin eher in der Java-Ecke beheimatet ...</p>
</blockquote>
<p>Da wird er vermutlich an Referenzen als Parameter gedacht und nur das &quot;&amp;&quot; vergessen haben.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715013</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 24 May 2009 16:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei der Deklaration von Klassen on Mon, 25 May 2009 13:20:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>,<br />
Danke! Wollte es gar nicht glauben, habe es mit allen Kompilern getestet, welche mir zur Verfügung stehen, funktioniert aber mit allen. Und im Standard steht es sogar, dass erst bei der Definition der Funktion die Typen vollständig bekannt sein müssen. Man lernt nie aus <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a>,<br />
Das ist eine Vermutung, aber im Code steht es anders und ich habe mich auf die Lösung von Firefighter bezogen. Firefighter hat nämlich auch keine Referenz verwendet. Und da wusste ich ja noch nicht, dass sowas auch geht <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/1715438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715438</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 25 May 2009 13:20:26 GMT</pubDate></item></channel></rss>