<?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[Aggregation: Objekt in Aggregat ändern oder nicht?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse die eine andere aggregiert. Also Klasse A hat einen member der vom Typ Klasse B ist.</p>
<p>Jetzt bildet Klasse A sozusagen meinen Hauptalgorithmus der ständig Methoden von Klasse B aufruft. Die ganzen Berechnungen finden also in B statt.<br />
Jetzt habe ich einen Container (z.B. std::vector) auf dem die ganzen berechnungen stattfidnen sollen (oder ein teil davon).</p>
<p>Ist es hier sauberer in Klasse A den container (member) anzulegen und dann über methodenaufrufe in B zu verändern (zurückzugeben)<br />
-&gt; siehe variante 1</p>
<p>oder ist es sauberer in B einen memeber anzulegen und dann jeweils aus A nur die Veränderung z.B über Methodenaufrufe zu verändern? Hier muss das ergebniss halt mal am ende dann mal zurückgegeben werden.<br />
-&gt; siehe variante 2</p>
<p>Welche der beiden varianten ist denn sauberer?</p>
<p>// ALLES PSEUDOCODE</p>
<p>VARIANTE 1</p>
<pre><code class="language-cpp">void A::hauptmethode()
{
     std::vector *vec = new std::vector(10);
     // b ist vom Typ B
     b.foo(vec);
     ...
}

void B::foo(std::vector*&amp; vec)
{
     // mache was mit vec und verändere ihn
}
</code></pre>
<p>VARIANTE 2</p>
<pre><code class="language-cpp">void A::hauptmethode()
{
     std::vector *erg;

     // b ist vom Typ B
     b.foo();
     b.bar();
     ...
    // rufe hier eine methode auf die einen ergebnisvector zurückgibt z.B.
    erg = b.erg();
}

// B hat einen member std::vector *vec
// der durch den konstruktor initialisiert wird

void B::foo()
{
     // mache was mit vec und verändere ihn
}

void B::bar()
{
   // verändere vec wieder z:B. durch multiplikation mit einem anderen
  // vec2 
}

std::vector* B::erg()
{
   // berechne ergebnis vector und gib zurück
   std::vector* erg = new std::vector(10);
   // mache mit erg was also berechne es

   return erg;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/266997/aggregation-objekt-in-aggregat-ändern-oder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 17:20:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266997.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 May 2010 18:25:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 18:25:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse die eine andere aggregiert. Also Klasse A hat einen member der vom Typ Klasse B ist.</p>
<p>Jetzt bildet Klasse A sozusagen meinen Hauptalgorithmus der ständig Methoden von Klasse B aufruft. Die ganzen Berechnungen finden also in B statt.<br />
Jetzt habe ich einen Container (z.B. std::vector) auf dem die ganzen berechnungen stattfidnen sollen (oder ein teil davon).</p>
<p>Ist es hier sauberer in Klasse A den container (member) anzulegen und dann über methodenaufrufe in B zu verändern (zurückzugeben)<br />
-&gt; siehe variante 1</p>
<p>oder ist es sauberer in B einen memeber anzulegen und dann jeweils aus A nur die Veränderung z.B über Methodenaufrufe zu verändern? Hier muss das ergebniss halt mal am ende dann mal zurückgegeben werden.<br />
-&gt; siehe variante 2</p>
<p>Welche der beiden varianten ist denn sauberer?</p>
<p>// ALLES PSEUDOCODE</p>
<p>VARIANTE 1</p>
<pre><code class="language-cpp">void A::hauptmethode()
{
     std::vector *vec = new std::vector(10);
     // b ist vom Typ B
     b.foo(vec);
     ...
}

void B::foo(std::vector*&amp; vec)
{
     // mache was mit vec und verändere ihn
}
</code></pre>
<p>VARIANTE 2</p>
<pre><code class="language-cpp">void A::hauptmethode()
{
     std::vector *erg;

     // b ist vom Typ B
     b.foo();
     b.bar();
     ...
    // rufe hier eine methode auf die einen ergebnisvector zurückgibt z.B.
    erg = b.erg();
}

// B hat einen member std::vector *vec
// der durch den konstruktor initialisiert wird

void B::foo()
{
     // mache was mit vec und verändere ihn
}

void B::bar()
{
   // verändere vec wieder z:B. durch multiplikation mit einem anderen
  // vec2 
}

std::vector* B::erg()
{
   // berechne ergebnis vector und gib zurück
   std::vector* erg = new std::vector(10);
   // mache mit erg was also berechne es

   return erg;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1898599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898599</guid><dc:creator><![CDATA[AnfaengerNeu++]]></dc:creator><pubDate>Mon, 17 May 2010 18:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 18:35:43 GMT]]></title><description><![CDATA[<p>mein Vorschlag wäre folgender</p>
<p>- Klasse A (Hauptalgo) als Member in B<br />
- Klasse B beinhaltet den Vector, auf den die Berechnungen stattfinden sollen.<br />
- Deine Algo-funktionen bekommen als Übergabeparameter den Vector, zum Beispiel per Referenz, falls dort direkt was geaendert werden soll.</p>
<p>Vorteil der ganzen Sache ist, dass du die Klasse deines Hauptalgorithmus nicht staendig von Programm zu Programm abaendern musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898603</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 17 May 2010 18:35:43 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 18:48:43 GMT]]></title><description><![CDATA[<p>BasicMan01 schrieb:</p>
<blockquote>
<p>- Deine Algo-funktionen bekommen als Übergabeparameter den Vector, zum Beispiel per Referenz, falls dort direkt was geaendert werden soll.</p>
</blockquote>
<p>Ich würde sogar noch weiter gehen, und keinen vector sondern nur iteratoren übergeben, welche man als template-Parameter übergeben kann. So kannst du dich komplett von vector lösen, und deinen Algorithmus allgemein implementieren.</p>
<p>Von welcher Art von Algorithmus sprechen wir denn? Kannst du evtl. auf eigenes Gebastel verzichten und einfach std::transform verwenden?<br />
<a href="http://www.cplusplus.com/reference/algorithm/transform/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/transform/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898611</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 17 May 2010 18:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 19:35:33 GMT]]></title><description><![CDATA[<blockquote>
<p>mein Vorschlag wäre folgender</p>
<p>- Klasse A (Hauptalgo) als Member in B<br />
- Klasse B beinhaltet den Vector, auf den die Berechnungen stattfinden sollen.<br />
- Deine Algo-funktionen bekommen als Übergabeparameter den Vector, zum Beispiel per Referenz, falls dort direkt was geaendert werden soll.</p>
<p>Vorteil der ganzen Sache ist, dass du die Klasse deines Hauptalgorithmus nicht staendig von Programm zu Programm abaendern musst.</p>
</blockquote>
<p>das verstehe ich nicht ganz - das würde ja alles umdrehen !? Wie kann ich denn dann in einer klasse C den hauptalgorithmus aufrufen wenn er selbst nur member ist !?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898644</guid><dc:creator><![CDATA[AnfaengerNeu++]]></dc:creator><pubDate>Mon, 17 May 2010 19:35:33 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 19:45:10 GMT]]></title><description><![CDATA[<p>Wo kommt auf einmal eine Klasse C her <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="😃"
    /> ... die hast du dir doch ausgedacht</p>
<p>in welchem Zusammenhang soll sie zu A oder B stehen?<br />
Wird C von B vererbt?<br />
Ist C eine komplett eigenständige Klasse die vielleicht auch A als Member benötigt, um auf die Algo-Funktionen zugreifen zu können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898648</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 17 May 2010 19:45:10 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 19:57:38 GMT]]></title><description><![CDATA[<p>Hmm...naja...also mein Algorithmus ist doch komplett sauber in einer eigenen Klasse:</p>
<pre><code class="language-cpp">class Algorithmus
{
    public:
        void ersterSchritt() {}
        void zweiterSchritt() {}
        //...

     B b;
};
</code></pre>
<p>dieser algorthmus wird natürlich so niht laufen - ich muss ihn irgendwo z.B. in der main aufrufen oder in einer sonstigen Klasse.</p>
<p>Und jetzt will ich eben die ganzen rechnungen von Algorithmus nicht in Algorithmus sondern z.B. in einem Member Klasse B machen.</p>
<p>ich steh jetzt auf dem schlauch <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1898660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898660</guid><dc:creator><![CDATA[AnfaengerNeu++]]></dc:creator><pubDate>Mon, 17 May 2010 19:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 20:08:10 GMT]]></title><description><![CDATA[<p>Dann implementier doch in <code>B</code> entsprechend die Methoden, die nötig sind und ruf sie von <code>Algorithmus</code> auf. Wo genau ist denn da das Problem?</p>
<p>Wie man Klassen und Funktionen dazu erstellt ist dir, nehme ich mal klar, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898665</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 17 May 2010 20:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 20:10:19 GMT]]></title><description><![CDATA[<p>Ja das hatte ich auch vor aber in meinem ersten post hatte ich ja gefragt<br />
ob es sauberer ist den std::vector in Algorithmus zu halten und dann an B zu übergeben oder eben in B den std::vector halten und dort einfach über die methodenaufrufe zu verändern....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898666</guid><dc:creator><![CDATA[AnfaengerNeu++]]></dc:creator><pubDate>Mon, 17 May 2010 20:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 20:11:58 GMT]]></title><description><![CDATA[<p>ich hab mal eben was zusammengepfuscht ohne jetzt mit Iteratoren zu handieren.<br />
aber das kann man ja beliebig erweitern.</p>
<pre><code class="language-cpp">class Algorithmus
{
    public:
        void ersterSchritt(std::vector&lt;int&gt; &amp;vec) {}
        void zweiterSchritt(std::vector&lt;int&gt; &amp;vec) {}
};

class B
{
	private:
		Algorithmus algo;
		vector&lt;int&gt; vecDaten;

	public:
		void berechnen()
		{
			algo.ersterSchritt(vecDaten);
		}
};

int main(int argc, char *argv[])
{
	B b;

	b.berechnen();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1898667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898667</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 17 May 2010 20:11:58 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 20:17:22 GMT]]></title><description><![CDATA[<p>So kann man es machen.<br />
Die Frage kann man aber imo nicht generell beantworten. Es kommt drauf an, wohin der vector eher gehört. Gehört er eher zu <code>B</code> oder zu <code>Algorithmus</code> ?</p>
<p>Ich könnte mir z.B vorstellen, dass du verschiedene Implementierungen von <code>ersterSchritt</code> und <code>zweiterSchritt</code> haben kannst und dann macht es schon Sinn, dass die Daten zu B gehören und nicht zu <code>Algorithmus</code> , weil du dann die Verfahren on the fly ändern kannst ohne da irgendwie etwas rumkopieren zu müssen.<br />
Wenn der <code>vector</code> allerdings lediglich eine Art zwischenspeicher für das Endergebnis ist, dann könnte der schon auch in Algorithmus gehalten werden.</p>
<p>Man kann sicher noch mehr ähnliche Beispiele finden, aber ich denke du verstehst, auf was ich hinaus will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898669</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 17 May 2010 20:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 20:17:46 GMT]]></title><description><![CDATA[<p>Hmm danke für das beispiel...ich frage mich nur - macht man das immer so? Also dass man eher von unten hoch gliedert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898670</guid><dc:creator><![CDATA[AnfaengerNeu++]]></dc:creator><pubDate>Mon, 17 May 2010 20:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Mon, 17 May 2010 20:27:33 GMT]]></title><description><![CDATA[<p>AnfaengerNeu++ schrieb:</p>
<blockquote>
<p>[...] macht man das immer so? [...]</p>
</blockquote>
<p>Nein, das hängt immer vom Anwendungsfall ab. Wie drakon schon beschrieb.<br />
Ich habe mich an deinem von gestern erstellten Thread orientiert</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-266924.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-266924.html</a></p>
<p>dort heißt es:</p>
<p>AnfaengerNeu++ schrieb:</p>
<blockquote>
<p>ich habe eine ganz einfache frage: Ich habe mehrere klassen die alle einen hauptalgorithmus darstellen. Alle diese klassen haben mehrere Methoden gemeinsam.</p>
</blockquote>
<p>mehrere Methoden gemeinsam deutet darauf hin, dass man diese nicht ständig pro Klasse anpassen muss. <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/1898673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898673</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 17 May 2010 20:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to Aggregation: Objekt in Aggregat ändern oder nicht? on Tue, 18 May 2010 08:46:34 GMT]]></title><description><![CDATA[<p>Für solche Sachen gibt es sogar ein eigenes Entwurfsmuster (falls der Algorithmus austauschbar sein soll): <a href="http://de.wikipedia.org/wiki/Schablonenmethode" rel="nofollow">Schablonenmethode</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898832</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 18 May 2010 08:46:34 GMT</pubDate></item></channel></rss>