<?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[Design-Frage Zuordnung zw. Klassen]]></title><description><![CDATA[<p>Hi,<br />
Ich hätte da ein Design Problem und hoffe hier Hilfe zu finden.<br />
Da der eigentliche Code zu umfangreich ist, poste ich es in verringerter Form.<br />
Es existiert eine Klasse A mit Rohdaten(u.A. ein String), dazu eine Klasse Manager_A, welche eine Liste von A-Objekten verwaltet:</p>
<pre><code class="language-cpp">class A{
	std::string Name;
	// Data
};
class Manager_A{
	std::vector&lt;A&gt; As;
        ...
};
</code></pre>
<p>Dann habe ich noch eine Klasse B und eine Manager_B Klasse die wiederum eine &quot;Liste&quot; von B-Objekten verwaltet.</p>
<pre><code class="language-cpp">class B{ // abstrakt
	// Data
};
class Manager_B{
	&quot;Liste&quot;&lt;B&gt; Bs;
	public:
		void tick();
        ...
};
</code></pre>
<p>Nun gibt es eine Beziehung zwischen B bzw jedem Untertyp von B und A -&gt; Jedes B &quot;benötigt/verwendet&quot; ein A.<br />
Welches A das ist, ist abhängig von dem string Name in A und dem Untertyp von B um den es sich handelt.<br />
Wobei ein A Objekt recht groß ist und nur einmal im Speicher steht. Also ein Untertyp von B hat genau ein A, wobei ein A von mehreren Objekten eines Untertyps von B verwendet werden kann.</p>
<p>Manager_B iteriert nun in tick() durch all seine Member und ruft für jedes Manager_A auf. Welcher wiederum das zu dem aktuellen B zugehörige A liefert.<br />
Die Art der Abfrage welches A zu welchem B gehört ist Teil des Problems(siehe weiter unten)</p>
<pre><code class="language-cpp">&lt;pseudocode&gt;
void Manager_B::tick(){
	for(Bs -&gt; actual_B)
	    Manager_A::GetInstance.(actual_B).DoSmth();
}
&lt;/pseudocode&gt;
</code></pre>
<p>Nun zu dem eigentlichen Problem:<br />
In Manager_B gibt es wie angemerkt eine &quot;Liste&quot; mit B-Objekten. Bei den Vorgängen in tick() ist es allerdings wichtig, dass alle B-Objekte mit &quot;gleichem&quot; A in Folge aufgerufen werden. Diese Liste sollte also geordnet sein.</p>
<p>Erst dachte ich daran jedem B einen Pointer auf ein A-Objekt in Manager_A zu geben, allerdings gebe ich einer außenstehenden Klasse ungern Zeiger/Referenzen auf Objekte, die von einer anderen verwaltet werden. Darüberhinaus löst das nicht das Problem, dass die Objekte geordnet sein müssen.</p>
<p>Nach einigen Überlegungen habe ich folgende &quot;Lösung&quot; gefunden:</p>
<p>Die &quot;Liste&quot; ist eine std::map&lt; unsigned int, std::vector&lt;B&gt; &gt; Bs;<br />
Wobei alle Bs mit gleichem A in dem vector&lt;B&gt; gespeichert werden und der unsigned int für den Index des dazugehörigen A in Manager_A steht.</p>
<p>Der Vorteil ist, dass alle Bs mit gleichem A nacheinander behandelt werden können, es keinerlei Sortierung zur Laufzeit benötigt und nicht jedes B einen Key auf ein A speichern muss.<br />
Die Einfügemethode von Manager_B bekommt einen string übergeben, prüft welchem A dieser in Manager_A entspricht und speichert sich den Index als unsigned int.<br />
Bei den Vorgängen in tick() benötigt man keine Suche in der Map oder den vector&lt;B&gt;, denn da ohnehin alle behandelt werden müssen, kann man einfach durchiterieren.</p>
<p>Meine Frage ist nun, ob es da nicht eine bessere Lösung geben könnte, da mir das Design nicht so gut erscheint.<br />
Besonders da jedes Mal wenn ein B hinzugefügt wird, alle A durchlaufen werden müssen<br />
und &quot;Name&quot; mit dem übergebenen String verglichen werden muss.</p>
<p>Eine Alternative die mir einfällt, wäre eine Liste die alle B speichert. Diese müsste dann aber auch sortiert werden/bleiben.<br />
Darüberhinaus dachte ich noch an eine Lösung direkt über Polymorphie, wobei es dann für jeden Subtyp von B eine static variable bräuchte die den Index des zugehörigen As bzw.<br />
einen Pointer darauf speichert + eine geordnete Liste benötigt, da die Ordnungsstruktur eine Ebene tiefer (an die Objekte) weitergegeben wird.</p>
<p>Ich würde mich über Vorschläge freuen.<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293412/design-frage-zuordnung-zw-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 08:57:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293412.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Oct 2011 15:07:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design-Frage Zuordnung zw. Klassen on Sun, 02 Oct 2011 15:07:56 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich hätte da ein Design Problem und hoffe hier Hilfe zu finden.<br />
Da der eigentliche Code zu umfangreich ist, poste ich es in verringerter Form.<br />
Es existiert eine Klasse A mit Rohdaten(u.A. ein String), dazu eine Klasse Manager_A, welche eine Liste von A-Objekten verwaltet:</p>
<pre><code class="language-cpp">class A{
	std::string Name;
	// Data
};
class Manager_A{
	std::vector&lt;A&gt; As;
        ...
};
</code></pre>
<p>Dann habe ich noch eine Klasse B und eine Manager_B Klasse die wiederum eine &quot;Liste&quot; von B-Objekten verwaltet.</p>
<pre><code class="language-cpp">class B{ // abstrakt
	// Data
};
class Manager_B{
	&quot;Liste&quot;&lt;B&gt; Bs;
	public:
		void tick();
        ...
};
</code></pre>
<p>Nun gibt es eine Beziehung zwischen B bzw jedem Untertyp von B und A -&gt; Jedes B &quot;benötigt/verwendet&quot; ein A.<br />
Welches A das ist, ist abhängig von dem string Name in A und dem Untertyp von B um den es sich handelt.<br />
Wobei ein A Objekt recht groß ist und nur einmal im Speicher steht. Also ein Untertyp von B hat genau ein A, wobei ein A von mehreren Objekten eines Untertyps von B verwendet werden kann.</p>
<p>Manager_B iteriert nun in tick() durch all seine Member und ruft für jedes Manager_A auf. Welcher wiederum das zu dem aktuellen B zugehörige A liefert.<br />
Die Art der Abfrage welches A zu welchem B gehört ist Teil des Problems(siehe weiter unten)</p>
<pre><code class="language-cpp">&lt;pseudocode&gt;
void Manager_B::tick(){
	for(Bs -&gt; actual_B)
	    Manager_A::GetInstance.(actual_B).DoSmth();
}
&lt;/pseudocode&gt;
</code></pre>
<p>Nun zu dem eigentlichen Problem:<br />
In Manager_B gibt es wie angemerkt eine &quot;Liste&quot; mit B-Objekten. Bei den Vorgängen in tick() ist es allerdings wichtig, dass alle B-Objekte mit &quot;gleichem&quot; A in Folge aufgerufen werden. Diese Liste sollte also geordnet sein.</p>
<p>Erst dachte ich daran jedem B einen Pointer auf ein A-Objekt in Manager_A zu geben, allerdings gebe ich einer außenstehenden Klasse ungern Zeiger/Referenzen auf Objekte, die von einer anderen verwaltet werden. Darüberhinaus löst das nicht das Problem, dass die Objekte geordnet sein müssen.</p>
<p>Nach einigen Überlegungen habe ich folgende &quot;Lösung&quot; gefunden:</p>
<p>Die &quot;Liste&quot; ist eine std::map&lt; unsigned int, std::vector&lt;B&gt; &gt; Bs;<br />
Wobei alle Bs mit gleichem A in dem vector&lt;B&gt; gespeichert werden und der unsigned int für den Index des dazugehörigen A in Manager_A steht.</p>
<p>Der Vorteil ist, dass alle Bs mit gleichem A nacheinander behandelt werden können, es keinerlei Sortierung zur Laufzeit benötigt und nicht jedes B einen Key auf ein A speichern muss.<br />
Die Einfügemethode von Manager_B bekommt einen string übergeben, prüft welchem A dieser in Manager_A entspricht und speichert sich den Index als unsigned int.<br />
Bei den Vorgängen in tick() benötigt man keine Suche in der Map oder den vector&lt;B&gt;, denn da ohnehin alle behandelt werden müssen, kann man einfach durchiterieren.</p>
<p>Meine Frage ist nun, ob es da nicht eine bessere Lösung geben könnte, da mir das Design nicht so gut erscheint.<br />
Besonders da jedes Mal wenn ein B hinzugefügt wird, alle A durchlaufen werden müssen<br />
und &quot;Name&quot; mit dem übergebenen String verglichen werden muss.</p>
<p>Eine Alternative die mir einfällt, wäre eine Liste die alle B speichert. Diese müsste dann aber auch sortiert werden/bleiben.<br />
Darüberhinaus dachte ich noch an eine Lösung direkt über Polymorphie, wobei es dann für jeden Subtyp von B eine static variable bräuchte die den Index des zugehörigen As bzw.<br />
einen Pointer darauf speichert + eine geordnete Liste benötigt, da die Ordnungsstruktur eine Ebene tiefer (an die Objekte) weitergegeben wird.</p>
<p>Ich würde mich über Vorschläge freuen.<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126262</guid><dc:creator><![CDATA[tqr86]]></dc:creator><pubDate>Sun, 02 Oct 2011 15:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Zuordnung zw. Klassen on Sun, 02 Oct 2011 21:06:41 GMT]]></title><description><![CDATA[<p>Niemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126446</guid><dc:creator><![CDATA[tqr86]]></dc:creator><pubDate>Sun, 02 Oct 2011 21:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Zuordnung zw. Klassen on Sun, 02 Oct 2011 21:53:42 GMT]]></title><description><![CDATA[<p>Klingt irgendwie merkwürdig. Erklär uns vielleicht mal, was die konkrete Anwendung ist, bzw. welches konkrete Problem du lösen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2126460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126460</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 02 Oct 2011 21:53:42 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Zuordnung zw. Klassen on Mon, 03 Oct 2011 04:07:05 GMT]]></title><description><![CDATA[<p>Wenn Du für Deine Map statt des Index für A einen Hashcode von A verwendest (den A bereit stellt) musst Du beim Einfügen nicht erst das passende A suchen.</p>
<p>In Deinem Fall könntest Du zum Beispiel string A::getname() verwenden, sofern der für jedes mögliche Objekt von A eindeutig ist.</p>
<p>Grundsätzlich solltest Du Dir aber überlegen, dass wenn B::anyB und A::anotherA eine Beziehung haben, es vielleicht sinnvoll ist, die direkt in den Klassen abzubilden. Das spart zumindest einige Indirektionen über die &quot;Manager&quot;-Klassen.</p>
<p>Etwa so:</p>
<pre><code class="language-cpp">void Manager_B::addObject(const B&amp; b)
{
    bs[b.getAssociatedAName()].push_back(b);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2126511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2126511</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Oct 2011 04:07:05 GMT</pubDate></item></channel></rss>