C++-Klassen: Beidseitig gerichtete Assoziation – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self C++-Klassen: Beidseitig gerichtete Assoziation Tue, 10 Jun 08 19:14:56 Z https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255470#m1255470 https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255470#m1255470 <p>Hi,</p> <p>ich versuche 2 Klassen zu Programmieren, die gegenseitig Elemente der anderen (oder Referenzen auf die andere) beinhalten können sollen.</p> <p>Das brauche ich später für die Programmierung eines Pokerspiels, bei dem die Klasse Spiel mehrere Spieler als Attribute enthält, aber die Spieler auch eine Referenz auf das Spiel enthalten sollen, damit sie z.B. sehen können, welche Karten auf dem Tisch liegen.</p> <p>Ich hab das Ganze mal vereinfacht:</p> <p>fileA.h:</p> <pre><code class="block language-c++"> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifndef</span> <span class="token expression">CLASS_A_H </span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">CLASS_A_H</span> <span class="token expression">CLASS_A_H </span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span> </span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"fileB.h"</span> </span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">classA</span> <span class="token punctuation">{</span> <span class="token keyword">public</span><span class="token operator">:</span> classB ab<span class="token punctuation">;</span> <span class="token function">classA</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout <span class="token operator"><<</span> <span class="token string">"Konstruktor von A"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span> </span> </code></pre> <p>fileB.h:</p> <pre><code class="block language-c++"> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifndef</span> <span class="token expression">CLASS_B_H </span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">CLASS_B_H</span> <span class="token expression">CLASS_B_H </span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span> </span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"fileA.h"</span> </span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">classB</span> <span class="token punctuation">{</span> <span class="token keyword">public</span><span class="token operator">:</span> classA ba<span class="token punctuation">;</span> <span class="token function">classB</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout <span class="token operator"><<</span> <span class="token string">"Konstruktor von B"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span> </span> </code></pre> <p>Wenn ich das in einer main-Funktion einbinde und compilieren will kommt folgende Fehlermeldung:<br> In file included from fileA.h:5,<br>                  from fileA.cpp:4:<br> fileB.h:12: Fehler: »classA« bezeichnet keinen Typ</p> <p>Wenn ich in einer der beiden Dateien das Include der anderen und das Attribut der anderen Klasse weglasse klappt alles.<br> Wenn ich aus den Attributen Pointer mache (also classA *ba) klappt es ebenfalls nicht.</p> <p>Gibt es dafür einen Trick? Sowas wie "extern class classA" oder so ähnlich?</p> <p>Oder geht das grundsätzlich nicht? Was mich aber wundern würde, weil es in der UML ja auch beidseitig gerichtete Assotiationen gibt. Nur finde ich keinen C++ Code dazu.</p> <p>mfG,<br> steckl</p> C++-Klassen: Beidseitig gerichtete Assoziation Tue, 10 Jun 08 19:56:27 Z https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255473#m1255473 https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255473#m1255473 <p>Hallo,</p> <p>Ich kann dir jetzt nicht direkt konkret helfen, aber irgendwie scheint dein Ansatz komisch.</p> <p>Ich hätte es so gemacht, dass ich eine Klasse für das Spiel machen würde und eine Klasse für einen Spieler. Da ich kein C++ kann hier ein wenig Pseudocode:</p> <pre><code class="block language-java"><span class="token keyword">class</span> <span class="token class-name">Game</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> array players<span class="token punctuation">;</span> <span class="token keyword">public</span> method <span class="token function">addPlayer</span><span class="token punctuation">(</span>player<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>players<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>player<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">public</span> method <span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Player</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> object game<span class="token punctuation">;</span> <span class="token keyword">private</span> constructor <span class="token class-name">Player</span><span class="token punctuation">(</span>game<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>game <span class="token operator">=</span> game<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> game <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Game</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> player1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Player</span><span class="token punctuation">(</span>game<span class="token punctuation">)</span><span class="token punctuation">;</span> player2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Player</span><span class="token punctuation">(</span>game<span class="token punctuation">)</span><span class="token punctuation">;</span> player3 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Player</span><span class="token punctuation">(</span>game<span class="token punctuation">)</span><span class="token punctuation">;</span> game<span class="token punctuation">.</span><span class="token function">addPlayer</span><span class="token punctuation">(</span>player1<span class="token punctuation">)</span><span class="token punctuation">;</span> game<span class="token punctuation">.</span><span class="token function">addPlayer</span><span class="token punctuation">(</span>player2<span class="token punctuation">)</span> game<span class="token punctuation">.</span><span class="token function">addPlayer</span><span class="token punctuation">(</span>player3<span class="token punctuation">)</span><span class="token punctuation">;</span> game<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Dann hast du deine Beziehungen wunderbar abgebildet und die Spieler können auf das Spiel zugreifen und das Spiel weiß welche Spieler aktuell mitspielen. Ich weiß nicht ob ich deine Frage richtig verstanden habe, aber so würde ich an die Sache herangehen. Wenn ich ganz falsch liege dann freue ich mich schon auf eine Erklärung wie man es richig[er] macht :D</p> <p>Jeena<br> <img src="http://jeenaparadies.net/pavatar.png" alt="" loading="lazy"></p> <div class="signature">-- <br> <a href="http://jeenaparadies.net/weblog/2008/jun/product-red" rel="nofollow noopener noreferrer">(PRODUCT) RED</a> gegen AIDS | <a href="http://jeenaparadies.net/webdesign/jlog/" rel="nofollow noopener noreferrer">Jlog</a> | <a href="http://jeenaparadies.net/gourmetica-mentiri/" rel="nofollow noopener noreferrer">Gourmetica Mentiri</a> </div> C++-Klassen: Beidseitig gerichtete Assoziation Tue, 10 Jun 08 20:08:50 Z https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255471#m1255471 https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255471#m1255471 <p>hi!</p> <p>Das Stichwort heisst "forward declaration". Mehr dazu: <a href="http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11" rel="nofollow noopener noreferrer">http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11</a></p> <p>bye, Frank!</p> <div class="signature">-- <br> Never argue with an idiot. He will lower you to his level and then<br> beat you with experience. </div> C++-Klassen: Beidseitig gerichtete Assoziation Tue, 10 Jun 08 20:17:18 Z https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255472#m1255472 https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255472#m1255472 <p>Hi,</p> <blockquote> <p>Das Stichwort heisst "forward declaration". Mehr dazu: <a href="http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11" rel="nofollow noopener noreferrer">http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11</a></p> </blockquote> <p>Super, vielen Dank!<br> Ich muss einfach nur "class classA;", bzw. "class classB;" in die entsprechenden Dateien einfügen. :-)</p> <p>mfG,<br> steckl</p> C++-Klassen: Beidseitig gerichtete Assoziation Tue, 10 Jun 08 20:12:04 Z https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255474#m1255474 https://forum.selfhtml.org/self/2008/jun/10/c-klassen-beidseitig-gerichtete-assoziation/1255474#m1255474 <p>Hi,</p> <blockquote> <p>Ich kann dir jetzt nicht direkt konkret helfen, aber irgendwie scheint dein Ansatz komisch.</p> </blockquote> <p>Er ist genau wie deiner. Vielleicht ist es nur nicht so rüber gekommen, weil ich ein einfacheres Code-Beispiel gewählt, da es hier schon nicht klappt.</p> <blockquote> <p>Ich hätte es so gemacht, dass ich eine Klasse für das Spiel machen würde und eine Klasse für einen Spieler. Da ich kein C++ kann hier ein wenig Pseudocode:</p> <pre><code class="block language-java"></code></pre> </blockquote> <p>class Game {</p> <blockquote> <p>private array players;<br> public method addPlayer(player) { this.players.push(player) };<br> public method start() {};<br> }</p> <p>class Player {<br> private object game;<br> private constructor Player(game) { this.game = game; }<br> }</p> </blockquote> <pre><code class="block"> Genau so hätte ich es auch gemacht, nur muss ich statt "private object game" den Datentyp (bzw. Klassenname) von game angeben, in diesem Fall wäre das Game. Die Deklaration der Klassen Game und Player möchte ich in 2 unterschiedliche Module packen (wie in meinem Beispiel classA und classB). Wenn sich die beiden Module jetzt gegenseitig einbinden sollen sagt der Compiler, dass der Datentyp nicht bekannt ist. > Dann hast du deine Beziehungen wunderbar abgebildet und die Spieler können auf das Spiel zugreifen und das Spiel weiß welche Spieler aktuell mitspielen. Ja, genau. > Ich weiß nicht ob ich deine Frage richtig verstanden habe, aber so würde ich an die Sache herangehen. Wenn ich ganz falsch liege dann freue ich mich schon auf eine Erklärung wie man es richig[er] macht :D Du hast es mir so erklärt, wie ich es auch machen wollte, aber nicht in C++ umsetzen kann. mfG, steckl </code></pre>