<?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[Designproblem mit Typsystem Taschenrechner]]></title><description><![CDATA[<p>Tach...</p>
<p>ich schreibe mir gerade einen kleinen Taschenrechner. Soweit funktioniert das Ding schon ganz gut, doch da sich die Berechnungen in Mathe nicht nur auf Skalare beschränken, möchte ich meinen Taschenrechner auch um Komplexe Zahlen, Vektoren und Matrizen erweitern.</p>
<p>Als Ansatz hatte ich so eine Art Typsystem als Klassenhierachie im Kopf:</p>
<pre><code>class NumericType {
public:
operator+(const NumericType&amp;) = 0;
operator-(const NumericType&amp;) = 0;
//operator...(const NumericType&amp;) = 0;
};

class Scalar : public NumericType {...};
class Complex : public NumericType {...};
class Vector : public NumericType {...};
class Matrix : public NumericType {...};
</code></pre>
<p>So könnte ich da dann meine Berechnungen ungefähr so umsetzen:</p>
<pre><code>typedef struct {
NumericType* value;
//...
} Token;

Token GetToken() {...}
// in einer Berechnung zb.

Token CurrentToken;
Result = CurrentToken-&gt;Value + GetToken()-&gt;Value;
</code></pre>
<p>So würde dann für jeden Typ der richtige Operator aufgerufen. Wo ich aber noch nicht ganz sicher bin, wie ich am besten die mathematischen Gesetze (mit den Gesetzen mein ich zb. wenn der User ein Skalar zu einem Vektor addieren will, was ja eigentlich nicht definiert ist) berücksichtige? Innerhalb der Implementationen oder sollte das der Parser schon vorher klären und notfalls eine Exception auslösen?</p>
<p>Ich will einfach mal eure Meinung, Hinweise oder Alternativen zu meinem Ansatz hören...</p>
<p>Besten Danke, MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/127825/designproblem-mit-typsystem-taschenrechner</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 07:24:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/127825.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Nov 2005 19:18:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designproblem mit Typsystem Taschenrechner on Sun, 27 Nov 2005 19:18:36 GMT]]></title><description><![CDATA[<p>Tach...</p>
<p>ich schreibe mir gerade einen kleinen Taschenrechner. Soweit funktioniert das Ding schon ganz gut, doch da sich die Berechnungen in Mathe nicht nur auf Skalare beschränken, möchte ich meinen Taschenrechner auch um Komplexe Zahlen, Vektoren und Matrizen erweitern.</p>
<p>Als Ansatz hatte ich so eine Art Typsystem als Klassenhierachie im Kopf:</p>
<pre><code>class NumericType {
public:
operator+(const NumericType&amp;) = 0;
operator-(const NumericType&amp;) = 0;
//operator...(const NumericType&amp;) = 0;
};

class Scalar : public NumericType {...};
class Complex : public NumericType {...};
class Vector : public NumericType {...};
class Matrix : public NumericType {...};
</code></pre>
<p>So könnte ich da dann meine Berechnungen ungefähr so umsetzen:</p>
<pre><code>typedef struct {
NumericType* value;
//...
} Token;

Token GetToken() {...}
// in einer Berechnung zb.

Token CurrentToken;
Result = CurrentToken-&gt;Value + GetToken()-&gt;Value;
</code></pre>
<p>So würde dann für jeden Typ der richtige Operator aufgerufen. Wo ich aber noch nicht ganz sicher bin, wie ich am besten die mathematischen Gesetze (mit den Gesetzen mein ich zb. wenn der User ein Skalar zu einem Vektor addieren will, was ja eigentlich nicht definiert ist) berücksichtige? Innerhalb der Implementationen oder sollte das der Parser schon vorher klären und notfalls eine Exception auslösen?</p>
<p>Ich will einfach mal eure Meinung, Hinweise oder Alternativen zu meinem Ansatz hören...</p>
<p>Besten Danke, MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928575</guid><dc:creator><![CDATA[dirk diggler]]></dc:creator><pubDate>Sun, 27 Nov 2005 19:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem mit Typsystem Taschenrechner on Sun, 27 Nov 2005 21:44:11 GMT]]></title><description><![CDATA[<p>/e: doppelpost...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928670</guid><dc:creator><![CDATA[cin]]></dc:creator><pubDate>Sun, 27 Nov 2005 21:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem mit Typsystem Taschenrechner on Sun, 27 Nov 2005 21:43:50 GMT]]></title><description><![CDATA[<p>Ich persönlich würde es in Scalar, Complex, etc. implementieren. Dazu müsste entweder jede Klasse speichern, zu welchem Typ sie gehört, oder du musst mit dynamic_cast arbeiten - was ich persönlich für recht unschön halte ;).</p>
<p>Wenn mich nicht alles täuscht gibt es auch ein Design Pattern, welches die Sache recht gut löst. (So dass Scalar, Complex, etc. nichts voneinander wissen müssen.) Nur hab ich das nie gebraucht, kann dir somit leider auch net sagen, wies aufgebaut is <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=":/"
      alt="😕"
    /> .</p>
<p>Naja vielleicht hilft auch eine einfache Verknüpfungsliste, in der du die verschiedenen Klassen(-namen) reinschreibst, die nicht miteinander kooperieren können. Wenns nur bei bestimmten Operationen Ausnahmen geben soll, hilft noch ein Extra-Flag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928674</guid><dc:creator><![CDATA[cin]]></dc:creator><pubDate>Sun, 27 Nov 2005 21:43:50 GMT</pubDate></item></channel></rss>