<?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[forward type declarations]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich habe hier zwei Klassen die sich gegenseitig bedingen. Das löste ich bisher mit forward type declarations. Damit konnte ich pointer der jeweils anderen Klassen speichern.</p>
<p>Jetzt will ich aber auch über die Pointer auf Methoden der jeweils anderen Klasse zugreifen. Geht das oder muss ich das Design umstellen?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259863/forward-type-declarations</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 17:14:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259863.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Jan 2010 15:53:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 15:53:08 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich habe hier zwei Klassen die sich gegenseitig bedingen. Das löste ich bisher mit forward type declarations. Damit konnte ich pointer der jeweils anderen Klassen speichern.</p>
<p>Jetzt will ich aber auch über die Pointer auf Methoden der jeweils anderen Klasse zugreifen. Geht das oder muss ich das Design umstellen?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846477</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 28 Jan 2010 15:53:08 GMT</pubDate></item><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 15:58:24 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>Jetzt will ich aber auch über die Pointer auf Methoden der jeweils anderen Klasse zugreifen. Geht das oder muss ich das Design umstellen?</p>
</blockquote>
<p>In der Sourcedatei kannst du durchaus den jeweils Header einbinden, und dann auch über die Zeiger zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846481</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 28 Jan 2010 15:58:24 GMT</pubDate></item><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 16:24:03 GMT]]></title><description><![CDATA[<p>Ich hab' mir mal die Mühe gemacht mein Problem zurecht zu stutzen:</p>
<p>B.hpp:</p>
<pre><code class="language-cpp">#ifndef B
#define B

#include &lt;string&gt;
#include &lt;vector&gt;

class A

class B
{
public:
  void add_a(A* a)
  {
    as_.push_back(a);
  }

  const std::string&amp; get_content()
  {
    content_.clear();
    for(int i=0, j=as_.size(); i&lt;j; ++i)
    {
      content_ += &quot;  &quot; + as_.at(i)-&gt;get_content() + &quot;\n&quot;;
    }
    return content_;
  }

private:
  std::string content_;
  std::vector&lt;A*&gt; as_;
};

#endif
</code></pre>
<p>A.hpp</p>
<pre><code class="language-cpp">#ifndef A
#define A

#include &lt;string&gt;
#include &lt;vector&gt;

#include &quot;B.hpp&quot;

class A
{
public:
  const std::string&amp; get_content()
  {
    content_.clear();
    for(int i=0, j=bs_.size(); i&lt;j; ++i)
    {
      content_ += bs_.at(i).get_content() + &quot;\n&quot;;
    }
    return content_;
  }

  void add_b(B* b)
  {
    bs_.push_back(b);
  }
private:
  std::string content_;
  std::vector&lt;B*&gt; bs_;
};

#endif
</code></pre>
<p><a href="http://test.cc" rel="nofollow">test.cc</a></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;B.hpp&quot;
#include &quot;A.hpp&quot;

int
main()
{
  A* a = new A();
  B* b = new B();

  B-&gt;add_a(a);
  std::cout &lt;&lt; b-&gt;get_content();

  delete B;
  delete A;
}
</code></pre>
<p>Das Bsp. kompiliert natürlich nicht. Woher soll der Compiler wissen was er in Zeile 22 von B.hpp machen soll? Ich weiß es auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Beide Klassen haben jeweils eine Methode die gleich heißen: &quot;get_content&quot; Hätten auch heißen können: &quot;do_some_stuff&quot;<br />
Aber diese Methoden sind das Problem. Beide Klassen wollen von der jeweils anderen eine Methode aufrufen.</p>
<p>Was machen <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846505</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 28 Jan 2010 16:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 16:37:21 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>Beide Klassen haben jeweils eine Methode die gleich heißen: &quot;get_content&quot; Hätten auch heißen können: &quot;do_some_stuff&quot;<br />
Aber diese Methoden sind das Problem. Beide Klassen wollen von der jeweils anderen eine Methode aufrufen.</p>
<p>Was machen <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>
</blockquote>
<p>Du kannst nicht beide gleichzeitig inline in der Klassendefinition definieren, weil sie von der Definition der jeweils anderen Klasse abhängen -&gt; wenigstens eine der beiden Funktionen muss außerhalb ihrer Klasse definiert werden, z.B. B.hpp</p>
<pre><code class="language-cpp">#ifndef B_HPP
#define B_HPP

#include &lt;string&gt;
#include &lt;vector&gt;

class A

class B
{
public:
  void add_a(A* a)
  {
    as_.push_back(a);
  }

  const std::string&amp; get_content();

private:
  std::string content_;
  std::vector&lt;A*&gt; as_;
};
// --- hier könnte auch die .cc -Datei anfangen
// nicht vorher, weil die include-Direktive in A.hpp dank include-Guards unwirksam ist, wenn A.hpp von B.hpp aus inkludiert wird
#include &lt;A.hpp&gt;
inline const std::string&amp; A::get_content()
{
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1846516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846516</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 28 Jan 2010 16:37:21 GMT</pubDate></item><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 17:38:02 GMT]]></title><description><![CDATA[<p>Ich hab's nochmal überarbeitet:</p>
<p>B.hpp:</p>
<pre><code class="language-cpp">#ifndef B_HPP_
#define B_HPP_

#include &lt;string&gt;
#include &lt;vector&gt;

class A;

class B
{
public:
  void add_a(A* a);
  const std::string&amp; get_content();
private:
  std::string content_;
  std::vector&lt;A*&gt; as_;
};

#endif
</code></pre>
<p><a href="http://B.cc" rel="nofollow">B.cc</a>:</p>
<pre><code class="language-cpp">#include &quot;A.hpp&quot;
#include &quot;B.hpp&quot;

void
B::
add_a(A* a)
{
  as_.push_back(a);
}

const std::string&amp;
B::
get_content()
{
  content_.clear();
  for(int i=0, j=as_.size(); i&lt;j; ++i)
  {
    content_ += &quot;  &quot; + as_.at(i)-&gt;get_content() + &quot;\n&quot;;
  }
  return content_;
}
</code></pre>
<p>A.hpp:</p>
<pre><code class="language-cpp">#ifndef A_HPP_
#define A_HPP_

#include &lt;string&gt;
#include &lt;vector&gt;

#include &quot;B.hpp&quot;

class A
{
public:
  const std::string&amp; get_content();
  void add_b(B* b);
private:
  std::string content_;
  std::vector&lt;B*&gt; bs_;
};

#endif
</code></pre>
<p><a href="http://A.cc" rel="nofollow">A.cc</a></p>
<pre><code class="language-cpp">#include &quot;A.hpp&quot;

const std::string&amp;
A::
get_content()
{
  content_.clear();
  for(int i=0, j=bs_.size(); i&lt;j; ++i)
  {
    content_ += bs_.at(i)-&gt;get_content() + &quot;\n&quot;;
  }
  return content_;
}

void
A::
add_b(B* b)
{
  bs_.push_back(b);
}
</code></pre>
<p><a href="http://main.cc" rel="nofollow">main.cc</a>:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;B.hpp&quot;
#include &quot;A.hpp&quot;

int
main()
{
  A* a = new A();
  B* b = new B();

  b-&gt;add_a(a);
  std::cout &lt;&lt; b-&gt;get_content();

  delete b;
  delete a;
}
</code></pre>
<p>Jetzt kompiliert er (g++) aber der Linker weigert sich:<br />
(edit: jetzt doch)</p>
<pre><code>g++ A.cc B.cc main.cc
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1846564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846564</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 28 Jan 2010 17:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 17:35:22 GMT]]></title><description><![CDATA[<p>Du musst die anderen Quelldateien auch noch angeben:</p>
<pre><code>g++ A.cc B.cc main.cc
</code></pre>
<p>In deinem Falle empfehle ich auch noch den Beitrag <a href="http://www.drakon.ch/?id=&amp;offset=2&amp;mobile=0&amp;show_entry=77" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846567</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 28 Jan 2010 17:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to forward type declarations on Thu, 28 Jan 2010 17:36:45 GMT]]></title><description><![CDATA[<p>Autsch, Tippfehler in <a href="http://A.cc" rel="nofollow">A.cc</a> und - viel schlimmer - dem Compiler <a href="http://A.cc" rel="nofollow">A.cc</a> nicht mitgegeben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Hab's oben korrigiert. Jetzt geht's.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1846569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846569</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 28 Jan 2010 17:36:45 GMT</pubDate></item></channel></rss>