<?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[Klasse in sich selbst aufrufen]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich arbeite derzeit daran, Personen via Klasse als Freunde zusammenzufügen, um mich ein bisschen besser in die Materie einzuarbeiten.<br />
Dabei erstelle ich via</p>
<pre><code class="language-cpp">Person hans(&quot;Hans Wurst&quot;);
 Person daniel(&quot;Daniel Käse&quot;);
</code></pre>
<p>die Klasse für die Person Hans Wurst und die person Daniel Käse und füge via</p>
<pre><code class="language-cpp">hans.befreunden(käse);
 daniel.befreunden(hans);
</code></pre>
<p>die beiden als Freunde zusammen.</p>
<p>Meine befreunden Funktion sieht derzeit so aus:</p>
<pre><code class="language-cpp">void befreunden(Person p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(p);
    }
</code></pre>
<p>Dabei habe ich vorher freunde als Vektor in der Klasse definiert:</p>
<pre><code class="language-cpp">vector&lt;Person&gt; freunde;
</code></pre>
<p>Um das ganze logischer zu gestalten wollte ich nun aber, dass ich per einem einzigen Aufruf von befreunden die beiden Personen als Freunde zusammenfüge. In diesem Sinne dachte ich mir zunächst die Funktion in dieser Richtung umzuschreiben:</p>
<pre><code class="language-cpp">void befreunden(Person *p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(*p);
    }
</code></pre>
<p>und dann mit</p>
<pre><code class="language-cpp">hans.befreunden(&amp;daniel);
</code></pre>
<p>aufzurufen.<br />
Nun dachte ich mir in die Funktion befreunden</p>
<pre><code class="language-cpp">p.freunde.push_back(   );
</code></pre>
<p>hinzuzufügen. Leider habe ich aber keine Ahnung wie ich nun das Objekt Hans als Variable in dieser Funktion verwenden kann.</p>
<p>Kann mir jemand helfen, sofern ihr verstanden habt was ich will? <sup>.</sup></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301866/klasse-in-sich-selbst-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 17:33:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301866.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Apr 2012 12:12:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 12:12:21 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich arbeite derzeit daran, Personen via Klasse als Freunde zusammenzufügen, um mich ein bisschen besser in die Materie einzuarbeiten.<br />
Dabei erstelle ich via</p>
<pre><code class="language-cpp">Person hans(&quot;Hans Wurst&quot;);
 Person daniel(&quot;Daniel Käse&quot;);
</code></pre>
<p>die Klasse für die Person Hans Wurst und die person Daniel Käse und füge via</p>
<pre><code class="language-cpp">hans.befreunden(käse);
 daniel.befreunden(hans);
</code></pre>
<p>die beiden als Freunde zusammen.</p>
<p>Meine befreunden Funktion sieht derzeit so aus:</p>
<pre><code class="language-cpp">void befreunden(Person p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(p);
    }
</code></pre>
<p>Dabei habe ich vorher freunde als Vektor in der Klasse definiert:</p>
<pre><code class="language-cpp">vector&lt;Person&gt; freunde;
</code></pre>
<p>Um das ganze logischer zu gestalten wollte ich nun aber, dass ich per einem einzigen Aufruf von befreunden die beiden Personen als Freunde zusammenfüge. In diesem Sinne dachte ich mir zunächst die Funktion in dieser Richtung umzuschreiben:</p>
<pre><code class="language-cpp">void befreunden(Person *p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(*p);
    }
</code></pre>
<p>und dann mit</p>
<pre><code class="language-cpp">hans.befreunden(&amp;daniel);
</code></pre>
<p>aufzurufen.<br />
Nun dachte ich mir in die Funktion befreunden</p>
<pre><code class="language-cpp">p.freunde.push_back(   );
</code></pre>
<p>hinzuzufügen. Leider habe ich aber keine Ahnung wie ich nun das Objekt Hans als Variable in dieser Funktion verwenden kann.</p>
<p>Kann mir jemand helfen, sofern ihr verstanden habt was ich will? <sup>.</sup></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199014</guid><dc:creator><![CDATA[Sinsei]]></dc:creator><pubDate>Thu, 05 Apr 2012 12:12:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 12:21:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">p-&gt;freunde.push_back(*this);
</code></pre>
<p>Vielleicht wäre auch eine non-member Funktion hier sinvoller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199019</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Thu, 05 Apr 2012 12:21:30 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 12:24:51 GMT]]></title><description><![CDATA[<p>Ich habe mir für soetwas wie &quot;gegenseitige Referenzierung&quot; meist eine Hilfsklasse gebaut, welche das &quot;Verheiraten&quot; und &quot;Scheiden&quot; übernimmt. Der habe ich dann immer die beiden Objekte übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199021</guid><dc:creator><![CDATA[Helmut.Jakoby]]></dc:creator><pubDate>Thu, 05 Apr 2012 12:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 12:29:57 GMT]]></title><description><![CDATA[<p>Sinsei schrieb:</p>
<blockquote>
<p>Hiho,</p>
<p>ich arbeite derzeit daran, Personen via Klasse als Freunde zusammenzufügen, um mich ein bisschen besser in die Materie einzuarbeiten.<br />
Dabei erstelle ich via</p>
<pre><code class="language-cpp">Person hans(&quot;Hans Wurst&quot;);
 Person daniel(&quot;Daniel Käse&quot;);
</code></pre>
<p>die Klasse für die Person Hans Wurst und die person Daniel Käse</p>
</blockquote>
<p>Du erstellst keine Klassen. Die Klasse ist Person. hans und daniel sind Instanzen (oder auch Objekte) der Klasse Person.</p>
<blockquote>
<p>und füge via</p>
<pre><code class="language-cpp">hans.befreunden(käse);
 daniel.befreunden(hans);
</code></pre>
<p>die beiden als Freunde zusammen.</p>
</blockquote>
<p>Du meinst wohl <code>hans.befreunden(daniel);</code></p>
<blockquote>
<p>Meine befreunden Funktion sieht derzeit so aus:</p>
<pre><code class="language-cpp">void befreunden(Person p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(p);
    }
</code></pre>
<p>Dabei habe ich vorher freunde als Vektor in der Klasse definiert:</p>
<pre><code class="language-cpp">vector&lt;Person&gt; freunde;
</code></pre>
</blockquote>
<p>Das ist sehr ungewöhnlich, denn hiermit legst du Kopien der Freunde an, keine Verweise auf die Freunde.</p>
<blockquote>
<p>Um das ganze logischer zu gestalten wollte ich nun aber, dass ich per einem einzigen Aufruf von befreunden die beiden Personen als Freunde zusammenfüge. In diesem Sinne dachte ich mir zunächst die Funktion in dieser Richtung umzuschreiben:</p>
<pre><code class="language-cpp">void befreunden(Person *p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(*p);
    }
</code></pre>
<p>und dann mit</p>
<pre><code class="language-cpp">hans.befreunden(&amp;daniel);
</code></pre>
<p>aufzurufen.</p>
</blockquote>
<p>Du hast eine merkwürdige Vorstellung davon, was Logik einer Freundschaft angeht. Ich kann dich also zu meinem Freund erklären?</p>
<p>Aber gut, nehmen wir bloß einmal an, dass das Beispiel ungünstig gewählt ist und es eine sinnvolle Anwendung gibt:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;

using namespace std;

class Person
{
  string name;
  vector&lt;Person*&gt; freunde;
public:
  Person(string name): name(name) {}
  void befreunden(Person&amp; freund)
  {
    freunde.push_back(&amp;freund);
    freund.freunde.push_back(this);
  }
  friend ostream&amp; operator&lt;&lt;(ostream &amp;out, const Person&amp; person)
  {
    out &lt;&lt; &quot;Ich bin &quot; &lt;&lt; person.name &lt;&lt; &quot; und meine Freunde sind:&quot;;
    for(auto freund: person.freunde)
      out &lt;&lt; '\n' &lt;&lt; freund-&gt;name;
    return out;
  }
};

int main()
{
  Person hans(&quot;Hans Dampf&quot;);
  Person daniel(&quot;Daniel Käse&quot;);

  hans.befreunden(daniel);
  cout &lt;&lt; hans &lt;&lt; '\n' &lt;&lt; daniel &lt;&lt; '\n';
}
</code></pre>
<p>Und wehe dir, die Freunde sind tot, wenn sie ausgegeben werden! Daher wäre es vielleicht sinnvoll, das Design etwas zu überdenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199023</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 05 Apr 2012 12:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 12:31:10 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void befreunden( Person* p )
{
    freunde.push_back( *p );
    p.freunde.push_back( this );
}
</code></pre>
<p>Ich würde an deiner Stelle die Freunde nicht per Kopie verwalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199024</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Thu, 05 Apr 2012 12:31:10 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 13:37:40 GMT]]></title><description><![CDATA[<p>Aufbauend auf dem, was SeppJ schrieb:</p>
<p>(Edit: Und nochmal angepasst)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;string&gt;
#include &lt;utility&gt;
#include &lt;memory&gt;

struct Person
{
  std::string name;
  std::vector&lt;Person*&gt; freunde;
};

struct Welt
{
  std::vector&lt;std::unique_ptr&lt;Person&gt;&gt; bewohner;

  Person* neuer_bewohner(std::string name);
};

Person* Welt::neuer_bewohner(std::string name)
{
  std::unique_ptr&lt;Person&gt; p (new Person);
  p-&gt;name = move(name);
  bewohner.push_back(move(p));
  return bewohner.back().get();
}

void befreunde(Person* wen, Person* mit)
{
  // TODO: ueberlegen, ob und wie man abfangen soll,
  // falls die zwei personen schon befreundet sind
  // oder ob wen==mit gilt.
  wen-&gt;freunde.push_back(mit);
  mit-&gt;freunde.push_back(wen);
}

int main()
{
  Welt w;
  Person* hans   = w.neuer_bewohner(&quot;Hans Wurst&quot;);
  Person* daniel = w.neuer_bewohner(&quot;Daniel Kaese&quot;);
  befreunde(hans,daniel);
}
</code></pre>
<p>(<a href="http://ideone.com/imL6B" rel="nofollow">kompiliert</a>)</p>
<p>Es ist sicherlich sinnvoll, durch Einsatz von privaten Elementen (private:) dafür zu sorgen, dass gewisse Invarianten nie verletzt werden. Beispielsweise kann man sich auf doppelseitige Freundschaften beschränken. Und falls ein Bewohner gelöscht werden soll, darf man natürlich nicht vergessen, die Freundeslisten von anderen dementsprechend anzupassen.</p>
<p>Cheers!<br />
k.k.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199038</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:37:40 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 13:18:52 GMT]]></title><description><![CDATA[<p>Warum erwähnst du boost::noncopyable und verwendest dann ein hässliches Makro? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /><br />
Und warum Zeiger statt Referenzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199040</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 13:33:19 GMT]]></title><description><![CDATA[<p>Ich hatte erst boost::noncopyable verwendet, musste aber dann feststellen, dass ideone den entsprechenden Header nicht griffbereit hat. So wird's von ideone im C++0x Modus <a href="http://ideone.com/xDAG9" rel="nofollow">kompiliert</a>.</p>
<p>Wie Du das Makro findest, interessiert mich nicht wirklich.</p>
<p>Edit: Mit vector&lt;unique_ptr&lt;Person&gt;&gt; statt list&lt;Person&gt; finde ich es doch besser. Dann muss ich auch nicht explizit sagen, dass Welt unkopierbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199041</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 14:07:06 GMT]]></title><description><![CDATA[<p>Danke erstmal.</p>
<p>Via</p>
<pre><code class="language-cpp">void befreunden(Person *p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(*p);
        p-&gt;freunde.push_back(*this);
    }
</code></pre>
<p>funktioniert das Ganze jetzt auch, nur habe ich nun noch ein anderes Problem.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Du erstellst keine Klassen. Die Klasse ist Person. hans und daniel sind Instanzen (oder auch Objekte) der Klasse Person.</p>
</blockquote>
<p>Danke, wusste nicht, dass man das Objekt nennt.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Du meinst wohl <code>hans.befreunden(daniel);</code></p>
</blockquote>
<p>Jup, meinte ich, leider nicht ganz richtig über den Beispiel-Code nachgedacht.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Das ist sehr ungewöhnlich, denn hiermit legst du Kopien der Freunde an, keine Verweise auf die Freunde.</p>
</blockquote>
<p>Und hier denke ich liegt jetzt wohl auch mein neues Problem. Vielleicht um euch mal mehr Einblick zu gewähren:</p>
<p>Ich habe eine main-funktion als Übung, die <strong>nicht verändert werden darf</strong>. Diese sieht so aus:</p>
<pre><code class="language-cpp">int main()
{
	Person daniel(&quot;Daniel Düsentrieb&quot;);
	Anschrift anschrift;
	anschrift.strasse = &quot;Raketenweg&quot;;
	anschrift.hausnummer = &quot;12&quot;;
	anschrift.postleitzahl = 90560;
	anschrift.stadt = &quot;Entenhausen&quot;;
	daniel.setzeAnschrift(anschrift);
	cout &lt;&lt; &quot;daniel.text(): &quot; &lt;&lt; daniel.text() &lt;&lt; endl;

	Person donald(&quot;Donald Duck&quot;);
	anschrift.strasse = &quot;Entengasse&quot;;
	anschrift.hausnummer = &quot;3&quot;;
	anschrift.postleitzahl = 90560;
	anschrift.stadt = &quot;Entenhausen&quot;;
	donald.setzeAnschrift(anschrift);

	cout &lt;&lt; &quot;\nDaniel und Donald werden Freunde:\n&quot;;
	daniel.befreunden(&amp;donald);
	cout &lt;&lt; &quot;daniel.text(): &quot; &lt;&lt; daniel.text() &lt;&lt; endl;
	cout &lt;&lt; &quot;donald.text(): &quot; &lt;&lt; donald.text() &lt;&lt; endl;

	Person person;
	cout &lt;&lt; &quot;\nEine geheimnisvolle Person befreundet sich mit allen anderen:\n&quot;;
	person.befreunden(&amp;daniel);
	person.befreunden(&amp;donald);
	cout &lt;&lt; &quot;person.text(): &quot; &lt;&lt; person.text() &lt;&lt; endl;

	anschrift.strasse = &quot;Erpelhofer Str.&quot;;
	anschrift.hausnummer = &quot;12&quot;;
	anschrift.postleitzahl = 90560;
	anschrift.stadt = &quot;Entenhausen&quot;;
	cout &lt;&lt; &quot;\nDonald zieht um nach &quot; &lt;&lt; anschrift.text() &lt;&lt; endl;
	donald.setzeAnschrift(anschrift);
	cout &lt;&lt; &quot;daniel.text(): &quot; &lt;&lt; daniel.text() &lt;&lt; endl;
}
</code></pre>
<p>Um dieses Konstrukt herum soll ich nun meine Klassen so aufbauen, dass ein bestimmter Text entsteht.</p>
<p>Mein Problem ist jetzt, wie ihr schon vermutet habt, dass ich nur Kopien in dem Vektor drinstehen habe und somit via</p>
<pre><code class="language-cpp">donald.setzeAnschrift(anschrift);
</code></pre>
<p>gegen Ende hin zwar die Anschrift der Person verändere, aber nicht die Anschrift dieser Person bei den Freunden. Mir wird also bei</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;daniel.text(): &quot; &lt;&lt; daniel.text() &lt;&lt; endl;
</code></pre>
<p>immer noch die alte Adresse von Donald Duck ausgegeben als Freund und nicht die Neue.</p>
<p>Die wohl wichtigen Funktionen in meinen Klassen hierfür wären nun:</p>
<pre><code class="language-cpp">Anschrift adresse;

    vector&lt;Person&gt; freunde;
    void befreunden(Person *p)              //Einlesen der Unterklasse &quot;p&quot; als Freund
    {
        freunde.push_back(*p);
        p-&gt;freunde.push_back(*this);
    }
void Person::setzeAnschrift(Anschrift a)
{
    adresse = a;
}
</code></pre>
<p>Leider weiß ich nun jetzt nicht genau, was oder wie ich etwas ändern müsste, damit in dem Vektor eben nur die Adresse drin steht und nicht eine Kopie.</p>
<p>Besonders an SeppJ: Tut mir Leid, falls ich irgendwie dumm oder sonst wie rüberkomme, aber ich möchte nur in C++ besser werden und frage deswegen hier nach.</p>
<p>mfg Sinsei <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/2199075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199075</guid><dc:creator><![CDATA[Sinsei]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in sich selbst aufrufen on Thu, 05 Apr 2012 14:19:45 GMT]]></title><description><![CDATA[<p>Sinsei schrieb:</p>
<blockquote>
<p>Ich habe eine main-funktion als Übung, die <strong>nicht verändert werden darf</strong>.</p>
</blockquote>
<p>... hättest Du ruhig mal eher erwähnen können.</p>
<p>Sinsei schrieb:</p>
<blockquote>
<p>Leider weiß ich nun jetzt nicht genau, was oder wie ich etwas ändern müsste, damit in dem Vektor eben nur die Adresse drin steht und nicht eine Kopie.</p>
</blockquote>
<p>Du weißt nicht, was Du ändern musst? Guck Dir doch nochmal den kompletten Thread hier an. Fällt Dir da nix auf? Gar nix?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199083</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:19:45 GMT</pubDate></item></channel></rss>