<?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 Punktklasse]]></title><description><![CDATA[<p>Ich habe mir eine Template-Klasse Punkt geschrieben. Diese soll mit numerischen Datentypen (float, double, long double oder Integer-Typen) instantiert werden. (Ist instantiert der richtige Begriff?) Es ist geplant durch Vererbung den Punkten weitere Eigenschaften (zum Beispiel Material oder Farbe) zu geben.</p>
<p>Im Programm werden verschiedene Punktvektoren benoetigt. Zum Beispiel:</p>
<pre><code class="language-cpp">std::vector&lt;Point&lt;double&gt;*&gt; dbl_pnt_vec;
std::vector&lt;Point&lt;size_t&gt;*&gt; size_t_pnt_vec;
</code></pre>
<p>Die Punktvektoren moechte ich in einem Vektor ablegen.</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt; ??? &gt; &gt; pnt_vec;
pnt_vec.push_back (dbl_pnt_vec);
pnt_vec.push_back (size_t_pnt_vec);
</code></pre>
<p>Welcher Typ sollte fuer die Fragezeichen eingesetzt werden? Ich habe mir dazu eine Klasse AbstractPoint definiert, siehe Quelltext unten. Ich frage mich ob es andere / bessere Loesungen gibt?</p>
<pre><code class="language-cpp">/** Base class for all points */
class AbstractPoint
{
	~virtual AbstractPoint();
};

/** class Point */
template &lt;class T&gt; class Point : public AbstractPoint
{
public:
	/** constructor - constructs a Point object
	 \param x1
	 \param x2
	 \param x3
	 */
	Point (T x1, T x2, T x3);
	/** constructor - constructs a Point object
		 \param px array of type T and length 3
	 */
	Point (T px[3]);
	/** virtual destructor */
	virtual ~Point();

	/** const access operator */
	const T&amp; operator[] (size_t idx) const {
#ifndef NDEBUG
		if (idx &gt; 2) std::cerr &lt;&lt; &quot;Point::operator[] - idx error&quot; &lt;&lt; std::endl;
#endif
		return x[idx];
	}
	/** access operator (see book Effektiv C++ programmieren - subsection 1.3.2 */
	T&amp; operator[] (size_t idx) {
		return const_cast&lt;T&amp;&gt; (static_cast&lt;const Point&amp;&gt; (*this)[idx]);
	}

	/** returns the coordinates of the point contained in an array */
	const T* const getData () const { return x; }

	/** write point coordinates into stream (used from operator&lt;&lt;) */
	virtual void write (std::ostream &amp;os) const {
		os &lt;&lt; x[0] &lt;&lt; &quot; &quot; &lt;&lt; x[1] &lt;&lt; &quot; &quot; &lt;&lt; x[2] &lt;&lt; std::flush;
	}
	/** read point coordinates into stream (used from operator&gt;&gt;) */
	virtual void read (std::istream &amp;is) {
		is &gt;&gt; x[0] &gt;&gt; x[1] &gt;&gt; x[2];
	}

private:
	Point (const Point &amp; rhs); // compiler does not generate a copy constructor
	Point&amp; operator= (const Point &amp;rhs); // compiler does not generate an assignment op
	T x[3];
};
</code></pre>
<p>Ich bin auch an Verbesserungsvorschlaegen fuer die Punktklasse interessiert! <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/topic/259373/design-frage-punktklasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 19:04:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259373.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Jan 2010 07:38:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 07:38:56 GMT]]></title><description><![CDATA[<p>Ich habe mir eine Template-Klasse Punkt geschrieben. Diese soll mit numerischen Datentypen (float, double, long double oder Integer-Typen) instantiert werden. (Ist instantiert der richtige Begriff?) Es ist geplant durch Vererbung den Punkten weitere Eigenschaften (zum Beispiel Material oder Farbe) zu geben.</p>
<p>Im Programm werden verschiedene Punktvektoren benoetigt. Zum Beispiel:</p>
<pre><code class="language-cpp">std::vector&lt;Point&lt;double&gt;*&gt; dbl_pnt_vec;
std::vector&lt;Point&lt;size_t&gt;*&gt; size_t_pnt_vec;
</code></pre>
<p>Die Punktvektoren moechte ich in einem Vektor ablegen.</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt; ??? &gt; &gt; pnt_vec;
pnt_vec.push_back (dbl_pnt_vec);
pnt_vec.push_back (size_t_pnt_vec);
</code></pre>
<p>Welcher Typ sollte fuer die Fragezeichen eingesetzt werden? Ich habe mir dazu eine Klasse AbstractPoint definiert, siehe Quelltext unten. Ich frage mich ob es andere / bessere Loesungen gibt?</p>
<pre><code class="language-cpp">/** Base class for all points */
class AbstractPoint
{
	~virtual AbstractPoint();
};

/** class Point */
template &lt;class T&gt; class Point : public AbstractPoint
{
public:
	/** constructor - constructs a Point object
	 \param x1
	 \param x2
	 \param x3
	 */
	Point (T x1, T x2, T x3);
	/** constructor - constructs a Point object
		 \param px array of type T and length 3
	 */
	Point (T px[3]);
	/** virtual destructor */
	virtual ~Point();

	/** const access operator */
	const T&amp; operator[] (size_t idx) const {
#ifndef NDEBUG
		if (idx &gt; 2) std::cerr &lt;&lt; &quot;Point::operator[] - idx error&quot; &lt;&lt; std::endl;
#endif
		return x[idx];
	}
	/** access operator (see book Effektiv C++ programmieren - subsection 1.3.2 */
	T&amp; operator[] (size_t idx) {
		return const_cast&lt;T&amp;&gt; (static_cast&lt;const Point&amp;&gt; (*this)[idx]);
	}

	/** returns the coordinates of the point contained in an array */
	const T* const getData () const { return x; }

	/** write point coordinates into stream (used from operator&lt;&lt;) */
	virtual void write (std::ostream &amp;os) const {
		os &lt;&lt; x[0] &lt;&lt; &quot; &quot; &lt;&lt; x[1] &lt;&lt; &quot; &quot; &lt;&lt; x[2] &lt;&lt; std::flush;
	}
	/** read point coordinates into stream (used from operator&gt;&gt;) */
	virtual void read (std::istream &amp;is) {
		is &gt;&gt; x[0] &gt;&gt; x[1] &gt;&gt; x[2];
	}

private:
	Point (const Point &amp; rhs); // compiler does not generate a copy constructor
	Point&amp; operator= (const Point &amp;rhs); // compiler does not generate an assignment op
	T x[3];
};
</code></pre>
<p>Ich bin auch an Verbesserungsvorschlaegen fuer die Punktklasse interessiert! <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/1843060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843060</guid><dc:creator><![CDATA[123_tom_dabei]]></dc:creator><pubDate>Fri, 22 Jan 2010 07:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 07:52:40 GMT]]></title><description><![CDATA[<p>so richtig stören tut mich eigtl nur das hier:</p>
<pre><code class="language-cpp">#ifndef NDEBUG 
        if (idx &gt; 2) std::cerr &lt;&lt; &quot;Point::operator[] - idx error&quot; &lt;&lt; std::endl; 
#endif
</code></pre>
<p>dafür gibts assert</p>
<pre><code class="language-cpp">Point (T px[3]);
</code></pre>
<p>würd ich nicht anbieten<br />
Point(x[0], x[1], x[2])<br />
geht ja auch - und ist imho schöner zu lesen</p>
<pre><code class="language-cpp">const T* const getData () const { return x; }
</code></pre>
<p>so was empfind ich immer als ein wenig sinnlos...</p>
<p>obwohl du solche relativ überflüssigen Methoden anbietest, hast du keinerlei typedefs(z.bsp. value_type) oder container-typische funktionen wie begin() und end() (die du in ein- und ausgabefunktionen klasse nutzen könntest)</p>
<p>op&lt;&lt; und op&gt;&gt; überlädst du hoffentlich nur für AbstractPoint und nicht für jede ableitung einzeln?!</p>
<p>bb</p>
<p>PS: Sicher, dass Vererbung hier richtig ist (is-a Beziehung)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843061</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 22 Jan 2010 07:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 08:41:36 GMT]]></title><description><![CDATA[<p>Danke fuer die schneller Antwort und die konstruktive Kritik!</p>
<p>Ist</p>
<pre><code class="language-cpp">assert (idx&lt;=2);
</code></pre>
<p>eigentlich aequivalent zu</p>
<pre><code class="language-cpp">#ifndef NDEBUG
        if (idx &gt; 2) std::cerr &lt;&lt; &quot;Point::operator[] - idx error&quot; &lt;&lt; std::endl;
#endif
</code></pre>
<p>? Dann waere deine Schreibweise in der Tat eleganter.</p>
<p>Den zweiten Konstruktor habe ich entfernt. Die Schnittstelle will ich so minimal wie moeglich halten. Vermutlich werde ich sehr viele Punkte haben und schon aus diesem Grund sollte der Punkt nur das noetigste enthalten. Das fuehrt mich zu deinem dritten Kritikpunkt, naemlich das du</p>
<pre><code class="language-cpp">const T* const getData () const { return x; }
</code></pre>
<p>ein wenig sinnlos findest. Ich habe mich hier fuer eine Methode entschieden, weil ich die Schnittstelle klein halten will. Aber ich ueberlege mir das vlt. noch mal.</p>
<p>Die Ableitung von AbstractPoint ist eigentlich nur wegen meines Design-Problems (siehe mein erster Beitrag). Meine eigentliche (nicht virtuelle) Basisklasse soll Point sein. Das Klassentemplate kann aber mit verschiedenen Typen instantiert werden. Damit habe ich verschiedene Punkttypen (std::vector&lt; std::vector &lt;???&gt; &gt;). Gibt es dafuer eine bessere Loesung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843081</guid><dc:creator><![CDATA[123_tom_dabei]]></dc:creator><pubDate>Fri, 22 Jan 2010 08:41:36 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 08:55:35 GMT]]></title><description><![CDATA[<p>Ich verstehe die Motivation, Zeiger und polymorphe Basisklassen einzusetzen, nicht ganz in diesem Fall.</p>
<p>Du könntest mal einen &quot;Schritt zurück machen&quot; und erklären, was Du damit eigentlich bezwecken willst. Immerhin heißt dieser Thread &quot;Design-Frage&quot;. Das Thema schreit förmlich danach, dass Du das Problem beschreibst, was Du mit Deinem Design-Ansatz zu lösen verschst.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843084</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 22 Jan 2010 08:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 09:27:54 GMT]]></title><description><![CDATA[<p>Ich moechte Objekte beschreiben, welche aus Punkten bestehen. Es soll Objekte geben, die lediglich die Koordinaten haben (die von verschiedenen Datentypen sein koennen: double, float, int, ...). Die Punkte koennen aber auch zusaetzliche Eigenschaften haben. Dazu moechte ich Vererbung nutzen. Beispielsweise koennte ein Punkt einen Namen haben:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class NamedPoint : public Point &lt;T&gt;
</code></pre>
<p>oder eine Farbe, oder Materialeigenschaften tragen, ...</p>
<p>Ich habe daher Punkte von verschiedenen Typen. Fuer jeden Punkttyp existiert ein Vektor indem die Punkte gespeichert werden.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">std::vector&lt;Point&lt;double&gt;*&gt; dbl_pnt_vec;
std::vector&lt;Point&lt;size_t&gt;*&gt; size_t_pnt_vec;
std::vector&lt;NamedPoint&lt;size_t&gt;*&gt; named_size_t_pnt_vec;
std::vector&lt;ColoredPoint&lt;float&gt;*&gt; colored_float_pnt_vec;
...
</code></pre>
<p>Jetzt moechte ich all diese Vektoren in einem Vektor verwalten. Dazu benoetige ich ja eine Basisklasse, oder? Das ist die AbstractPoint-Klasse im ersten Post dieses Threads.</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt; AbstractPoint* &gt; &gt; pnt_vec;
</code></pre>
<p>Die Klasse AbstractPoint ist meiner Meinung nach etwas kuenstlich. Gibt es da bessere Loesungen? Ist mein Design vlt. falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843106</guid><dc:creator><![CDATA[123_tom_dabei]]></dc:creator><pubDate>Fri, 22 Jan 2010 09:27:54 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 10:07:47 GMT]]></title><description><![CDATA[<p>123_tom_dabei schrieb:</p>
<blockquote>
<p>Die Schnittstelle will ich so minimal wie moeglich halten.</p>
</blockquote>
<p>Das ist eine gute Idee, aber es gibt da ein paar Dinge zu beachten:<br />
1. Minimal gut, minimalistisch schlecht. Es geht nicht darum, immer das Minimum zu finden, sondern eine gut ausgewogene Sache.<br />
2. Ist deine Schnittstelle dadurch wirklich so klein? Vergiss nicht, dank dem dass du ein Array zurück gibst, gibst du eigentlich deine ganze interne Struktur bekannt und zurück. Das hat nichts mehr mit Kapselung zu tun und macht die Schnittstelle eigentlich grösser. Du schreibst zwar weniger, aber für den Anwender ist die Schnittstelle komplexer. Weniger schreiben heisst nicht, dass die Schnittstelle kleiner ist.</p>
<p>123_tom_dabei schrieb:</p>
<blockquote>
<p>Ich moechte Objekte beschreiben, welche aus Punkten bestehen. Es soll Objekte geben, die lediglich die Koordinaten haben (die von verschiedenen Datentypen sein koennen: double, float, int, ...). Die Punkte koennen aber auch zusaetzliche Eigenschaften haben. Dazu moechte ich Vererbung nutzen.</p>
</blockquote>
<p>Eher die falsche Beziehung. Sowas ist doch keine is-a Beziehung. Sowas ist eine has-a Beziehung. Zum Beispiel deine NamedPoint Klasse, sie <strong>besteht aus</strong> einem Namen und einem Punkt.</p>
<p>123_tom_dabei schrieb:</p>
<blockquote>
<p>Die Klasse AbstractPoint ist meiner Meinung nach etwas kuenstlich. Gibt es da bessere Loesungen? Ist mein Design vlt. falsch?</p>
</blockquote>
<p>Wozu willst du alles in einen Vector werfen? Sowas ist meistens völlig unnötig. Halte lieber separate Listen, wenn die Objekte miteinander nix zu tun haben, was hier meiner Meinung nach der Fall ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843129</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 22 Jan 2010 10:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 11:01:56 GMT]]></title><description><![CDATA[<p>Ich würde auch sagen dass das eher ein Fall für Aggregation als für Vererbung ist.<br />
Point: T x, T y, PointProperties* properties (kann NULL sein)<br />
PointProperties: std::string* name (kann NULL sein), Color* color (kann NULL sein) etc.</p>
<p>Damit hast du einen zusätzlichen Zeiger pro Punkt, das ist zumindest nicht schlechter als wenn du die Punkt-Klasse polymorph machen würdest (dann hättest du nämlich einen vtable Zeiger statt des &quot;properties&quot; Zeigers).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843162</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 22 Jan 2010 11:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 12:20:42 GMT]]></title><description><![CDATA[<p>Vielen Dank fuer die hilfreichen Antworten.</p>
<p>Ich habe das Klassentemplate erweitert:</p>
<pre><code class="language-cpp">/** class-template for Points
 * \param T the coordinate type
 * \param P the properties of the point (name, color, material, ...) */
template &lt;class T, class P&gt; class Point : public AbstractPoint, public P
{
...
};
</code></pre>
<p>Mit der Klasse PropertyEmpty kann ich mir einen Punkt ohne weitere Eigenschaften erzeugen, mit der Klasse PropertyName habe ich einen Punkt mit Namen, usw.</p>
<p>Trotzdem bleibt die Frage: Gibt es eine Alternative zur Ableitung von AbstractPoint um die verschiedenen Vektoren in einem Vektor von Vektoren speichern zu koennen.</p>
<p>Eigentlich eine neue Frage: Kann man eine verschiedene Anzahl von Template-Argumenten uebergeben? Dann koennte man sich einen Punkt ganz flexibel mit<br />
den benoetigten Eigenschaften, zum Beispiel Name, Farbe und ... durch</p>
<pre><code class="language-cpp">Point&lt;T, PropertyName, PropertyColor, weitere Property-Klassen&gt; p
</code></pre>
<p>zusammenbauen.</p>
<p>Ansonsten muesste man fuer die Kombination von Eigenschaften ja eigene Property-Klassen schreiben, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843222</guid><dc:creator><![CDATA[123_tom_dabei]]></dc:creator><pubDate>Fri, 22 Jan 2010 12:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 13:10:30 GMT]]></title><description><![CDATA[<p>Bringt nicht viel, wenn du nicht auf unsere Fragen und Antworten eingehst, daher zitiere ich mich jetzt einfach mal selbst:</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Eher die falsche Beziehung. Sowas ist doch keine is-a Beziehung. Sowas ist eine has-a Beziehung. Zum Beispiel deine NamedPoint Klasse, sie <strong>besteht aus</strong> einem Namen und einem Punkt.</p>
</blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Wozu willst du alles in einen Vector werfen? Sowas ist meistens völlig unnötig. Halte lieber separate Listen, wenn die Objekte miteinander nix zu tun haben, was hier meiner Meinung nach der Fall ist.</p>
</blockquote>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843256</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 22 Jan 2010 13:10:30 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Fri, 22 Jan 2010 16:33:13 GMT]]></title><description><![CDATA[<p>Ich möchte mich im wesentlichen meinen Vorrednern anschließen.<br />
Die wesentliche Frage ist doch, was Du mit diesen Objekten voller Punkte machen möchtest.</p>
<p>123_tom_dabei schrieb:</p>
<blockquote>
<p>Ich moechte Objekte beschreiben, welche aus Punkten bestehen. Es soll Objekte geben, die lediglich die Koordinaten haben (die von verschiedenen Datentypen sein koennen: double, float, int, ...). Die Punkte koennen aber auch zusaetzliche Eigenschaften haben.<br />
...<br />
Gibt es da bessere Loesungen? Ist mein Design vlt. falsch?</p>
</blockquote>
<p>das beantwortet die Frage nicht. Was heißt 'beschreiben' und vor allem - wieseo und wofür?</p>
<p>Es ist keine gute Idee einen vector von vectoren zu bilden - das ist nachher recht umständlich beim Zugriff. Deine Beschreibung hört sich eher nach einem vector von Objekten an, wobei jedes Objekt wiederum einen vector aus Punkten beinhaltet.<br />
Versuche mal ganz ohne Vererbung und ganz ohne Pointer in den vectoren aus zukommen.</p>
<p>Und ganz konkret nochmal nachgefragt: was hast Du mit der Farbe oder dem Namen, der an einem Punkt hängt, später vor?<br />
Sollen in einem einzelnen vector sowohl ein Punkt mit Farbe als auch ein Punkt mit Namen untergebracht sein?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843395</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 22 Jan 2010 16:33:13 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Sat, 23 Jan 2010 11:05:10 GMT]]></title><description><![CDATA[<p>Und auch noch als Nachtrag:<br />
die Basisklasse 'AbstractPoint' hat bisher überhaupt keinen Nutzen, da sie für einen std::vector&lt; AbstractPoint* &gt; keine virtuellen Methoden (außer dem Destruktor) anbietet.</p>
<p>123_tom_dabei, vllt. solltest du mal vom 'top-down-modell' ausgehen und die mögliche Benutzung des vectors beschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843617</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 23 Jan 2010 11:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage Punktklasse on Mon, 25 Jan 2010 07:11:14 GMT]]></title><description><![CDATA[<p>Ich will meine Motivation noch mal erklaeren. In einem bestehenden Programm gibt es eine Punkt-Klasse die abzueglich der Koordinaten 28 Attribute hat. Bisher hat jeder der eine zusaetzliche Eigenschaft des Punkts gebraucht hat diese einfach durch Aggregation (public!) dazu gefuegt. Nutze ich jetzt Aggregation habe ich ja wieder alle Eigenschaften in dieser riesigen Punkt-Klasse. Ich denke wenn der Nutzer meiner Klasse sich die Eigenschaften, die er benoetigt durch meine obigen Konstrukte selbst zusammenstellen kann, werden die Punkte deutlich kleiner.</p>
<p>Die Punkte werden zur Beschreibung von Polylinien genutzt. Eine Folge von Polylinien begrenzt eine Oberflaeche. Die Oberflaechen umschliessen Volumen.</p>
<p>Es gibt also Punkte die zu Polylinien gehoeren die vlt. eine Farbe haben sollen. Eine Flaeche koennte Materialeigenschaften haben, die mit einer bestimmten Farbe dargestellt werden. In der Rechnung werden die Materialeigenschaften benoetigt, zur Visualisierung die Farbe. Im Inneren eines Volumen haben die Punkte vlt. keine weiteren Eigenschaften. Das ist nur ein moegliches Szenario. Mir ist auch bewusst, dass ich die Eigenschaften meist besser den anderen geometrischen Objekten (Polyline, Flaeche, Volumen) zuordnen sollte. Ich kann aber nicht alles auf einmal aendern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>Ihr meint also, ich soll auf Vererbung von den Eigenschaftsklassen verzichten und das durch die folgende Aggregation loesen?</p>
<pre><code class="language-cpp">/** class-template for Points
 * \param T the coordinate type
 * \param P the properties of the point (name, color, material, ...) */
template &lt;class T, class P&gt; class Point : public AbstractPoint
{
public:
  P properties;
...
};
</code></pre>
<p>Dann waere der Zugriff auf eine Eigenschaft umstaendlicher als bei Vererbung.</p>
<p>Aber nach wie vor brauche ich fuer die durch die Templateklasse erzeugten verschiedenen Typen einen Basistyp - egal ob ich die Punkte in Vektoren oder Listen verwende.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18594">@Th69</a> (zu deinem Nachtrag)<br />
Genau das gefaellt mir ja auch nicht, dass AbstractPoint in der Vererbungshierarchie einfach oben drauf gesetzt wird. Das war aber bisher die einzige Loesung die mir eingefallen ist - deshalb ja der Thread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844312</guid><dc:creator><![CDATA[123_tom_dabei]]></dc:creator><pubDate>Mon, 25 Jan 2010 07:11:14 GMT</pubDate></item></channel></rss>