<?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[Versuche, mir friends zu machen ...]]></title><description><![CDATA[<p>Ich habe eine Klasse Auto, die als Attribute die Anzahl ihrer Türen und Reifen hat. Dazu noch eine Klasse Monteur, die die Reifen eines zu reparierenden Autos ausprinten soll. Deswegen ist der Monteur <em>friend</em> der Klasse Auto, damit er auf ihre privaten Attribute zugreifen kann.</p>
<pre><code class="language-cpp">// Auto.h
#ifndef AUTO_H
#define AUTO_H

#include &lt;stdio.h&gt;
#include &quot;Monteur.h&quot;

class Auto
{
  friend class Monteur;

  private:
    int reifen, tueren;

  public:
    Auto()
    {
       reifen = 4;
       tueren = 4;
    }

    void print_tueren();
};

void Auto::print_tueren()
{
  printf(&quot;%d\n&quot;, reifen);
}

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

#include &lt;stdio.h&gt;
#include &quot;Auto.h&quot;

class Monteur
{
  public:
    void print_reifen_des_zu_reparierenden_autos();
};

void Monteur::print_reifen_des_zu_reparierenden_autos()
{
	Auto *zu_reparierendes_auto;

	printf(&quot;%d&quot;, zu_reparierendes_auto-&gt;reifen);
}

#endif
</code></pre>
<p>Da ich vorher vom Compiler mit Errors erschlagen wurde, habe ich dafür auf Anrat Header-Guards eingebaut.</p>
<p>Das Main-Programm soll jetzt einfach nur die Reifen des zu rep. Autos printen, es sollte also (wegen des Konstruktors) 4 ausgegeben werden.<br />
Stattdessen bekomme ich aber irritierende Fehlermeldungen:</p>
<blockquote>
<p>In file included from Auto.h:5,<br />
from AutoTest.cpp:1:<br />
Monteur.h: In member function 'void Monteur::print_reifen_des_zu_reparierenden_autos()':<br />
Monteur.h:15: error: 'Auto' was not declared in this scope<br />
Monteur.h:15: error: 'zu_reparierendes_auto' was not declared in this scope</p>
</blockquote>
<p>Kann mir jemand zeigen, wie der Code richtig aussehen müsste und zu verstehen geben, warum? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252307/versuche-mir-friends-zu-machen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 13:27:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252307.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Oct 2009 20:49:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 20:49:41 GMT]]></title><description><![CDATA[<p>Ich habe eine Klasse Auto, die als Attribute die Anzahl ihrer Türen und Reifen hat. Dazu noch eine Klasse Monteur, die die Reifen eines zu reparierenden Autos ausprinten soll. Deswegen ist der Monteur <em>friend</em> der Klasse Auto, damit er auf ihre privaten Attribute zugreifen kann.</p>
<pre><code class="language-cpp">// Auto.h
#ifndef AUTO_H
#define AUTO_H

#include &lt;stdio.h&gt;
#include &quot;Monteur.h&quot;

class Auto
{
  friend class Monteur;

  private:
    int reifen, tueren;

  public:
    Auto()
    {
       reifen = 4;
       tueren = 4;
    }

    void print_tueren();
};

void Auto::print_tueren()
{
  printf(&quot;%d\n&quot;, reifen);
}

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

#include &lt;stdio.h&gt;
#include &quot;Auto.h&quot;

class Monteur
{
  public:
    void print_reifen_des_zu_reparierenden_autos();
};

void Monteur::print_reifen_des_zu_reparierenden_autos()
{
	Auto *zu_reparierendes_auto;

	printf(&quot;%d&quot;, zu_reparierendes_auto-&gt;reifen);
}

#endif
</code></pre>
<p>Da ich vorher vom Compiler mit Errors erschlagen wurde, habe ich dafür auf Anrat Header-Guards eingebaut.</p>
<p>Das Main-Programm soll jetzt einfach nur die Reifen des zu rep. Autos printen, es sollte also (wegen des Konstruktors) 4 ausgegeben werden.<br />
Stattdessen bekomme ich aber irritierende Fehlermeldungen:</p>
<blockquote>
<p>In file included from Auto.h:5,<br />
from AutoTest.cpp:1:<br />
Monteur.h: In member function 'void Monteur::print_reifen_des_zu_reparierenden_autos()':<br />
Monteur.h:15: error: 'Auto' was not declared in this scope<br />
Monteur.h:15: error: 'zu_reparierendes_auto' was not declared in this scope</p>
</blockquote>
<p>Kann mir jemand zeigen, wie der Code richtig aussehen müsste und zu verstehen geben, warum? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793997</guid><dc:creator><![CDATA[C-reator]]></dc:creator><pubDate>Sat, 17 Oct 2009 20:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 20:51:25 GMT]]></title><description><![CDATA[<p>[center]<strong>EDIT</strong>[/center]<br />
Das Ganze rufe ich hiermit auf:</p>
<pre><code class="language-cpp">#include &quot;Auto.h&quot;
#include &quot;Monteur.h&quot;

int main()
{

	//Auto *mein_auto = new Auto();
	//mein_auto-&gt;print_tueren();

	Monteur *monteur = new Monteur();
	monteur-&gt;print_reifen_des_zu_reparierenden_autos();
}
</code></pre>
<p>(und ich werde mich jetzt registern, damit ich auch mal Posts editen kann x])</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793999</guid><dc:creator><![CDATA[C-reator]]></dc:creator><pubDate>Sat, 17 Oct 2009 20:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 20:59:27 GMT]]></title><description><![CDATA[<p>Lass das #include &quot;Monteur.h&quot; in auto.h mal weg.</p>
<p>btw:<br />
Netter Titel. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1794003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794003</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 17 Oct 2009 20:59:27 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 21:00:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void Monteur::print_reifen_des_zu_reparierenden_autos()
{
    Auto *zu_reparierendes_auto;

    printf(&quot;%d&quot;, zu_reparierendes_auto-&gt;reifen);
}
</code></pre>
<p>das wird sowieso nicht funktionieren, da der Zeiger &quot;zu_reparierendes_auto&quot; nicht initialisiert wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1794004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794004</guid><dc:creator><![CDATA[CppCoder]]></dc:creator><pubDate>Sat, 17 Oct 2009 21:00:35 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 21:12:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22498">@CppCoder</a>: Behoben zu &quot;Auto *zu_reparierendes_auto = new Auto();&quot; .</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Danke <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=";D"
      alt="😉"
    /><br />
Wenn ich es weglasse, funktioniert es komischerweise ... warum funktioniert es dann?<br />
Wenn ich &quot;friend class Monteur;&quot; schreibe, dann muss der Compiler doch die Klasse Monteur schon kennen, aber sie ist dann doch noch gar nicht definiert ... ? <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="=/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1794006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794006</guid><dc:creator><![CDATA[C-reator]]></dc:creator><pubDate>Sat, 17 Oct 2009 21:12:31 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 21:22:28 GMT]]></title><description><![CDATA[<p>C-reator schrieb:</p>
<blockquote>
<p>Wenn ich &quot;friend class Monteur;&quot; schreibe, dann muss der Compiler doch die Klasse Monteur schon kennen</p>
</blockquote>
<p>Warum? Durch &quot;friend class Monteur;&quot; könnte er auch lernen, daß es diese Klasse überhaupt gibt und sich die Freundschaft schonmal merken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1794009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794009</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 17 Oct 2009 21:22:28 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sat, 17 Oct 2009 21:38:20 GMT]]></title><description><![CDATA[<p>C-reator schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Danke <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=";D"
      alt="😉"
    /><br />
Wenn ich es weglasse, funktioniert es komischerweise ... warum funktioniert es dann?<br />
Wenn ich &quot;friend class Monteur;&quot; schreibe, dann muss der Compiler doch die Klasse Monteur schon kennen, aber sie ist dann doch noch gar nicht definiert ... ? <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="=/"
      alt="😕"
    /></p>
</blockquote>
<p>Warum muss die Klasse wissen, wie die andere Implementiert ist? - Das interessiert die gar nicht. Sie (respektive der Compiler) muss nur wissen, dass diese Klasse auf die Internas zugreifen darf.</p>
<p>EDIT:<br />
Definitionen sind grundsätzlich nur dann erforderlich, wenn die resultierende Grösse interessiert, respektive auf das Objekt zugegriffen wird. Das heisst bei:</p>
<ul>
<li>Memberzugriff (inklusive kreierung)</li>
<li>Aggregierung</li>
<li>Vererbung</li>
<li>sizeof</li>
</ul>
<p>Nicht brauchen tust die Definition insbesondere bei:</p>
<ul>
<li>Zeigern</li>
<li>Rückgabetypen</li>
<li>Parameter</li>
<li>friends<br />
...</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1794011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794011</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 17 Oct 2009 21:38:20 GMT</pubDate></item><item><title><![CDATA[Reply to Versuche, mir friends zu machen ... on Sun, 18 Oct 2009 11:45:22 GMT]]></title><description><![CDATA[<p>Zur Erklärung der Fehler noch der Hinweis, daß du sogenannte &quot;Cross-Includes&quot; benutzt hast (d.h. die beiden Header-Dateien &quot;Auto.h&quot; und &quot;Monteur.h&quot; binden sich gegenseitig ein). Durch die Include-Guards hast du zwar die Endlosrekursion vermieden, aber jetzt kennt die Monteur-Klasse die Auto-Klasse nicht mehr (oder umgekehrt, je nachdem welche Datei zuerst eingebunden wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1794167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794167</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 18 Oct 2009 11:45:22 GMT</pubDate></item></channel></rss>