<?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[Frage zur Typumwandlung]]></title><description><![CDATA[<pre><code class="language-cpp">//Klassen Definition
class bruch
{
private:
	long zaehler,nenner;

public:
	bruch();
	bruch(long za, long ne);

	long getzaehler();
	long getnenner();
	double getdezimalwert();

	bruch operator+ (const bruch&amp; b);
	void ausgabe();
};
</code></pre>
<pre><code class="language-cpp">//Methodendefinition
double bruch::getdezimalwert()
{
	return (double(zaehler)/double(nenner));
}
</code></pre>
<p>Das Programm funktioniert so wunderbar, aber ich bin mir mit der Typumwandlung nicht so sicher.<br />
Sollte ich dafür lieber dynamic_cast oder static_cast nehmen?<br />
Kann mir jemand kurz erklären wann was besser ist zu nehmen?<br />
Was kann ich allgemein noch an dieser Klasse + definition noch verbessern?</p>
<p>vielen dank</p>
<p>gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228419/frage-zur-typumwandlung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 14:54:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228419.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Nov 2008 20:43:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 20:43:02 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//Klassen Definition
class bruch
{
private:
	long zaehler,nenner;

public:
	bruch();
	bruch(long za, long ne);

	long getzaehler();
	long getnenner();
	double getdezimalwert();

	bruch operator+ (const bruch&amp; b);
	void ausgabe();
};
</code></pre>
<pre><code class="language-cpp">//Methodendefinition
double bruch::getdezimalwert()
{
	return (double(zaehler)/double(nenner));
}
</code></pre>
<p>Das Programm funktioniert so wunderbar, aber ich bin mir mit der Typumwandlung nicht so sicher.<br />
Sollte ich dafür lieber dynamic_cast oder static_cast nehmen?<br />
Kann mir jemand kurz erklären wann was besser ist zu nehmen?<br />
Was kann ich allgemein noch an dieser Klasse + definition noch verbessern?</p>
<p>vielen dank</p>
<p>gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622139</guid><dc:creator><![CDATA[The architect]]></dc:creator><pubDate>Thu, 27 Nov 2008 20:43:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 20:51:38 GMT]]></title><description><![CDATA[<p>The architect schrieb:</p>
<blockquote>
<p>Sollte ich dafür lieber dynamic_cast oder static_cast nehmen?</p>
</blockquote>
<p>Eindeutig <code>static_cast</code> , der ist für Standardkonvertierungen wie deine geeignet. <code>dynamic_cast</code> brauchst du nur für polymorphe Downcasts.</p>
<p>The architect schrieb:</p>
<blockquote>
<p>Was kann ich allgemein noch an dieser Klasse + definition noch verbessern?</p>
</blockquote>
<p>Du solltest die Funktionen, die die Klasse nicht verändern (also hauptsächlich Getter), als <code>const</code> deklarieren. Zudem den Plus-Operator als globale Funktion implementieren. Vielleicht auch mehr als einen Dezimalwert anbieten (z.B. <code>float</code> , <code>long double</code> ).</p>
<p>Und mehr Methoden wären mit der Zeit auch ein Thema (z.B. eine private zum Kürzen). <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/1622150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622150</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 27 Nov 2008 20:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 20:52:51 GMT]]></title><description><![CDATA[<p><code>void ausgabe();</code> würd ich auf jeden Fall wegmachen...</p>
<p>Dafür aber operator &gt;&gt; und &lt;&lt; überladen...</p>
<pre><code class="language-cpp">double getdezimalwert();

würde bei mir zu

double GetValue() const
{
 return static_cast&lt;double&gt;(zaehler) / static_cast&lt;double&gt;(nenner);
}
</code></pre>
<p>Dein C-Style Cast geht zwar aber ist eben C und nicht C++ - dynamic_cast ist hier nicht notwendig - also begnügen wir uns mit static_cast - weil er genau für solche sachen ist ^^<br />
btw: man könnte so gar nen template aus dem GetValue machen...</p>
<p>bei mir würde es aber noch ne (private) fkt &quot;void normalize()&quot; geben... die kürzt halt bissl und so...<br />
Müsste zumindest vor jeder Ausgabe und vor Vergleichen ausgeführt werden - sonst wäre ja 1/2 != 2/4...</p>
<p>wo wir scho ma dabei sind: die anderen Operatoren willst du schon noch implementieren, oder? ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622155</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 27 Nov 2008 20:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 21:34:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Zudem den Plus-Operator als globale Funktion implementieren.</p>
</blockquote>
<p>Das verstehee ich noch nicht so ganz, soll ich den + Operator nun als friend implementieren?</p>
<p>also so?</p>
<pre><code class="language-cpp">friend bruch operator+ (const bruch&amp; b);
</code></pre>
<p>oder wie?</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>wo wir scho ma dabei sind: die anderen Operatoren willst du schon noch implementieren, oder? ^^</p>
</blockquote>
<p>Ja das kommt noch <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="🙂"
    /> Bin grad dabei dies zu machen.<br />
+=<br />
*=<br />
usw. mach ich dann auch noch<br />
und die Kürzenfunktion mach ich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622172</guid><dc:creator><![CDATA[yoda der Große]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 21:45:20 GMT]]></title><description><![CDATA[<p>yoda der Große schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Zudem den Plus-Operator als globale Funktion implementieren.</p>
</blockquote>
<p>Das verstehee ich noch nicht so ganz, soll ich den + Operator nun als friend implementieren?</p>
</blockquote>
<p>Nein, wie eine globale Funktion ausserhalb der Klasse, die auf die Klasse zugreift.</p>
<pre><code class="language-cpp">bruch operator+(const bruch&amp; left, const bruch&amp; right);
</code></pre>
<p>Entweder du erhältst das Kapselungsprinzip und greifst von aussen über die Getter, Setter und Konstruktoren zu. Oder du benutzt <code>friend</code> -Deklarationen, um Zugriff auf private Member zu erlauben.</p>
<p>P.S. Benutze vielleicht den gleichen Namen, das hilft bei der Identifizierung des Threaderstellers. Und Yoda ist klein! <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622180</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 27 Nov 2008 21:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 22:23:47 GMT]]></title><description><![CDATA[<p>Also so in der Art?</p>
<pre><code class="language-cpp">//Klassen Definition
class bruch
{
private:
	long zaehler,nenner;

public:
	bruch();
	bruch(long za, long ne);

	const long getzaehler();
	const long getnenner();
	const double getdezimalwert();

	friend ostream&amp; operator&lt;&lt; (ostream&amp; os,const bruch&amp; b);
	friend istream&amp; operator&gt;&gt; (istream&amp; is,bruch&amp; b);
};

	bruch operator+ (const bruch&amp; l, const bruch&amp; r);
</code></pre>
<pre><code class="language-cpp">bruch operator+ (const bruch&amp; l, const bruch&amp; r)
	{
		if (l.getnenner() == r.getnenner()) return bruch(r.getzaehler()+l.getzaehler,r.getnenner());

		return (l.getdeziamelwert()+r.getdezimalwert());
	}
</code></pre>
<p>Auserdem habe ich noch Probleme bei dem operator&lt;&lt;:</p>
<p>Ich habe ihn mir von dem funktionierenden operator &gt;&gt; hergeleitet</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt; (ostream&amp; os,const bruch&amp; b)
	{
		os &lt;&lt; b.zaehler &lt;&lt; &quot;\/&quot; &lt;&lt; b.nenner &lt;&lt; endl;
		return os;
	}
</code></pre>
<p>, aber das ist mit Sicherheit nicht korrekt</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt; (istream&amp; is, bruch&amp; b)
	{
		cout &lt;&lt; &quot;Zähler: &quot;;
		is &gt;&gt; b.zaehler;
		cout &lt;&lt; &quot;\nNenner: &quot; &lt;&lt; b.nenner;
		is &gt;&gt; b.nenner;
		return is;
	}
</code></pre>
<p>Ps: Das mit dem Nick: ups, das ist mein Name auf nem anderen board, da hab ich wohl falsch angeklickt <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="😉"
    /> sry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622204</guid><dc:creator><![CDATA[The architect]]></dc:creator><pubDate>Thu, 27 Nov 2008 22:23:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Thu, 27 Nov 2008 23:04:43 GMT]]></title><description><![CDATA[<p>normalerweise ist nen operator wie + in 3 zeilen definiert...</p>
<p>man geht einfach über den += - Operator... (den man aber dafür nat. erst ma deklariert haben muss)</p>
<p>also so was in der Richtung:</p>
<pre><code class="language-cpp">bruch operator +(const bruch &amp;lhs, const bruch &amp;rhs)
{
 bruch tmp(lhs);
 tmp += rhs;
 return tmp;
}
</code></pre>
<p>btw würde += bei mir anders aussehen ^^</p>
<pre><code class="language-cpp">bruch&amp; operator += (bruch &amp;lhs, const bruch &amp;rhs)
{ //als friend deklariert
 lhs.zaehler *= rhs.nenner;
 lhs.zaehler += rhs.zaehler*lhs.nenner;
 lhs.nenner *= rhs.nenner;
 return lhs;
}
</code></pre>
<p>in der Hoffnung, dass es stimmt ^^</p>
<pre><code class="language-cpp">std::ostream&amp; operator &lt;&lt; (std::ostream&amp; os, const bruch&amp; b)
{
   os &lt;&lt; b.zaehler &lt;&lt; &quot;/&quot; &lt;&lt; b.nenner;
   return os;
}
</code></pre>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, bruch&amp; b)
{ //hier sucht die Ausgabe GAR nichts drin!
   char slash;
   is &gt;&gt; b.zaehler &gt;&gt; slash &gt;&gt; b.nenner;
   return is;
}
</code></pre>
<p>Das ganze kann man dann so anwenden:</p>
<pre><code class="language-cpp">int main()
{
 bruch a(1,2); //1/2
 bruch b;
 std::cout &lt;&lt; &quot;Bitte geben Sie den Bruch ein, der zu 1/2 addiert werden soll (Form: Zaehler/Nenner)!&quot; &lt;&lt; std::endl;
 std::cin &gt;&gt; b;
 bruch c = a + b;
 std::cout &lt;&lt; a &lt;&lt; &quot; + &quot; &lt;&lt; b &lt;&lt; &quot; = &quot; &lt;&lt; c &lt;&lt; std::endl;
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622217</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 27 Nov 2008 23:04:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 10:43:59 GMT]]></title><description><![CDATA[<p>Okay ich habe das mal so umgesetzt wie ihr mir das geschildert habt.</p>
<pre><code class="language-cpp">//Definition der Klasse bruch
class bruch
{
private:
	long zaehler;
	long nenner;
public:
	bruch();
	bruch(long za, long ne);

	long getzaehler(bruch&amp; b);
	long getnenner(bruch&amp; b);
	double getdezimalwert(bruch&amp; b);

	friend bruch&amp; operator+= (bruch&amp; lhs, const bruch&amp; rhs);
	friend bruch&amp; operator-= (bruch&amp; lhs, const bruch&amp; rhs);
	friend bruch&amp; operator*= (bruch&amp; lhs, const bruch&amp; rhs);
	friend bruch&amp; operator/= (bruch&amp; lhs, const bruch&amp; rhs);
	friend ostream&amp; operator&lt;&lt; (ostream&amp; os, const bruch&amp; b);
	friend istream&amp; operator&gt;&gt; (istream&amp; is,bruch&amp; b);
};
</code></pre>
<p>Ich kann somit mit Getter methoden auf die Privaten member zugreifen.<br />
Ausserdem können die überladenen Operatoren über die friend Funktion auf Member der Klasse zugreifen.</p>
<p>Ist dies so nun in Ordnung? Oder habe etwas noch immer nicht verstanden?</p>
<p>Hierzu habe ich noch eine Frage ( sieht unten in Grün)</p>
<pre><code class="language-cpp">//Konstruktoren
bruch::bruch():zaehler(0),nenner(0){}
bruch::bruch(long za, long ne):zaehler(za),nenner(ne){}

//Public- und Friend-Methoden der Klasse bruch
long bruch::getzaehler(bruch&amp; b)
{
	return b.zaehler;
}
long bruch::getnenner(bruch&amp; b)
{
	return b.nenner;
}
double bruch::getdezimalwert(bruch&amp; b)
{
	return static_cast&lt;double&gt;(b.zaehler) / static_cast&lt;double&gt;(b.nenner);
}

bruch&amp; operator+= (bruch&amp; lhs, const bruch&amp; rhs)
{
	lhs.zaehler *= rhs.nenner;
	lhs.zaehler += rhs.zaehler*lhs.nenner;
	lhs.nenner *= rhs.nenner;
	return lhs;
}

bruch&amp; operator-= (bruch&amp; lhs, const bruch&amp; rhs)
{
	lhs.zaehler *= rhs.nenner;
	lhs.zaehler -= rhs.zaehler*lhs.nenner;
	lhs.nenner *= rhs.nenner;
	return lhs;
}
bruch&amp; operator*= (bruch&amp; lhs, const bruch&amp; rhs)
{
	lhs.zaehler *= rhs.zaehler;
	lhs.nenner *= rhs.nenner;
	return lhs;
}
bruch&amp; operator/= (bruch&amp; lhs, const bruch&amp; rhs)
{
	lhs.zaehler *= rhs.nenner;
	lhs.nenner *= rhs.zaehler;
	return lhs;
}
bruch operator+ (const bruch&amp; lhs, const bruch&amp; rhs)
{
//Kann man das hier auch etwas kürzer schreiben?
//weil hier wird ja nun ein Objekt namens tmp erstellt, und damit gearbeitet.
//So habe ich es schon mal gemacht: return complex(re+c.re, im+c.im);
//Das geht hier aber nicht weil wir den Überladenen += Operator benutzen oder?

	bruch tmp(lhs);
	tmp += rhs;
	return tmp;
}
bruch operator- (const bruch&amp; lhs, const bruch&amp; rhs)
{
	bruch tmp(lhs);
	tmp -= rhs;
	return tmp;
}
bruch operator* (const bruch&amp; lhs, const bruch&amp; rhs)
{
	bruch tmp(lhs);
	tmp *= rhs;
	return tmp;
}
bruch operator/ (const bruch&amp; lhs, const bruch&amp; rhs)
{
	bruch tmp(lhs);
	tmp /= rhs;
	return tmp;
}
ostream&amp; operator&lt;&lt; (ostream&amp; os,const bruch&amp; b)
{
	os &lt;&lt; b.zaehler &lt;&lt; &quot;/&quot; &lt;&lt; b.nenner &lt;&lt; endl;
	return os;
}

istream&amp; operator&gt;&gt; (istream&amp; is, bruch&amp; b)
{
	char rechenzeichen;
	is &gt;&gt; b.zaehler &gt;&gt; rechenzeichen &gt;&gt; b.nenner;
	return is;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1622348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622348</guid><dc:creator><![CDATA[The architect]]></dc:creator><pubDate>Fri, 28 Nov 2008 10:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 11:30:47 GMT]]></title><description><![CDATA[<p>Operator +=, -= usw. sollten nicht friend sein. Das sind Funktionen, die das Objekt verändern und Zugriff auf den Inhalt haben müssen.</p>
<p>Dafür machst du +,- usw. friend und kannst dann für + usw. entweder += nutzen, oder gleich auf den Inhalt zugreifen und ein neues Objekt zurückgeben.</p>
<pre><code class="language-cpp">bruch operator+ (const bruch&amp; lhs, const bruch&amp; rhs)
{
   return bruch(lhs.zaehler+rhs.zaehler,lhs.nenner+rhs.nenner);
}
</code></pre>
<p>Oder du kannst das friend gleich weglassen und die Member public machen, da es da, wie im anderen <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1622361.html#1622361" rel="nofollow">thread</a>, nicht nötig/erwartet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622362</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 28 Nov 2008 11:30:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 13:09:57 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">long getzaehler(bruch&amp; b) const; //const
    long getnenner(bruch&amp; b) const; //const
</code></pre>
<pre><code class="language-cpp">double getdezimalwert(bruch&amp; b) const; //hier könnte man auch überlegen, nen template draus zu bauen... vll will man doch mal nur nen int/...
</code></pre>
<p><code>operator -(bruch &amp;rhs)</code> fehlt noch (also die einfache negierung)...<br />
damit könnte man dann <code>-=</code> über <code>+= (-bruch)</code> lösen</p>
<p>btw:</p>
<blockquote>
<p>rechenzeichen</p>
</blockquote>
<p>das zeichen rennt wohl? ^^</p>
<p>Natürlich kann man +,-,/,* so implementieren, wie das drakon schreibt - aber ich finds nicht sooo übersichtlich... (mal davon abgesehen, dass es so falsch ist, wie es drakon geschrieben hat)<br />
hier wäre die richtige implementation:</p>
<pre><code class="language-cpp">bruch operator+ (const bruch&amp; lhs, const bruch&amp; rhs)
{
    bruch tmp(lhs);
    return tmp += rhs;
}
</code></pre>
<blockquote>
<p>die Member public machen</p>
</blockquote>
<p>Würd ich nicht machen - aber das musst du für dich selbst entscheiden...</p>
<p>des weiteren solltest du deinem bruch noch nen konstruktor von int geben...<br />
also so was:<br />
<code>bruch::bruch (int i) : zaehler(i), nenner(1) {}</code><br />
für float etc würde das zwar auch (ähnlich) gehen, aber der Sinn ist sicherlich nicht, dass man mit ungenauen Werten weiterrechnet:</p>
<pre><code class="language-cpp">float a = sqrt(2);
bruch b(a);

bruch::bruch(float a)
{
 //a so normieren, dass es in nen bruch passt - mit hinreichender genauigkeit - da sollte es nen algo bei wikipedia oder so geben, aber
 //float bleibt ja ne gleitkommazahl - eine, die nicht nur Elemente aus Q darstellen kann - sondern aus R
}
</code></pre>
<p>und += etc sollten vll wirklich nicht nur als friend sondern als member definiert werden...</p>
<p>+ kannst du als friend definieren, das ist aber nicht nötig - ich würd sie einfach als freie operatoren definieren...</p>
<p>bb</p>
<p>nachtrag:<br />
die skalarmultiplikation fehlt natürlich noch - also int * bruch<br />
das könnte man wie gesagt einerseits dadurch lösen, indem man jedem (gewünschten) typen nen standard-konstruktor für bruch gibt oder in dem man sie speziell definiert (was ich ja fast machen würde, was aber mehr arbeit wäre)...<br />
gleiches gilt für die addition/division/subtraktion mit nem int o.ä.</p>
<p>wenn ich mir das noch mal so überlege, erscheint es mir doch sinnvoller, jedem gewünschten typ einen CTor zu geben - könnte man zwar auch über templates lösen, aber dann hätte man wieder das problem mit float und double..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622432</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 28 Nov 2008 13:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 13:19:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Natürlich kann man +,-,/,* so implementieren, wie das drakon schreibt - aber ich finds nicht sooo übersichtlich... (mal davon abgesehen, dass es so falsch ist, wie es drakon geschrieben hat)<br />
hier wäre die richtige implementation:</p>
</blockquote>
<p>Ich habe ja geschrieben, dass er auch += nutzen kann. Das andere war ja nur ein Beispiel, dass er auch direkt auf die Variablen zugreifen kann. (Das es ein Bruch ist, habe ich gar nicht richtig gesehen. Ich habe einfach die Member genommen.. Klar kann man die nicht einfach zusammenzählen..)</p>
<blockquote>
<p>Würd ich nicht machen - aber das musst du für dich selbst entscheiden...</p>
</blockquote>
<p>Und was bitteschön stört dich an der öffentlichen Membern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622439</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 28 Nov 2008 13:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 13:41:26 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Das andere war ja nur ein Beispiel, dass er auch direkt auf die Variablen zugreifen kann.</p>
</blockquote>
<p>Sollte ja auch kein Vorwurf sein - mir ist schon klar, dass du das nur zeigen wolltest und dabei vrmtl nicht weiter drüber nachgedacht hast - weils auch keine Rolle gespielt hat... Nur, dass es ihn nicht total irritiert...</p>
<p>drakon schrieb:</p>
<blockquote>
<blockquote>
<p>Würd ich nicht machen - aber das musst du für dich selbst entscheiden...</p>
</blockquote>
<p>Und was bitteschön stört dich an der öffentlichen Membern?</p>
</blockquote>
<p>Warum soll man von außen den Bruch manipulieren können?<br />
Es zerstört (unsinnigerweise) die gesamte Kapselung... Beim Vector könnte es da ja sicherlich Anwendungen geben - obwohl mir keine einfällt...</p>
<p>Aber beim Bruch...<br />
Mach doch mal nen Bsp., wo so etwas sinnvoll wäre...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622455</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 28 Nov 2008 13:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 13:45:24 GMT]]></title><description><![CDATA[<p>Ich stimme unskilled hier auch zu, da es wohl selten Fälle geben wird, wo man nur den Zähler oder nur den Nenner ändert (für diese Fälle kann man immer noch Methoden anbieten). Eher wird man gerade den ganzen Bruch neusetzen oder mit den Operatoren manipulieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622459</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 28 Nov 2008 13:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 13:50:57 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>da es wohl selten Fälle geben wird, wo man nur den Zähler oder nur den Nenner ändert</p>
</blockquote>
<p>Fällt dir denn ein Fall ein? Mir fällt echt keiner ein...<br />
Vll sollte man noch ne Funktion erweitern hinzufügen (und die kürzen Funktion existiert noch immer nicht - genau so, wie die Vergleichsoperatoren noch fehlen)...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622464</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 28 Nov 2008 13:50:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 14:03:41 GMT]]></title><description><![CDATA[<p>Ich sehe nicht, warum das die Kapselung stören sollte. Wenn ich einen Zähler, oder Nenner setzen will, dann sollte der auch den Wert bekommen. Bei 0 im Nenner kann man sich natürlich streiten, aber imo hat selbst das nichts in einer Bruchklasse zu suchen.</p>
<p>Aber allgemein habe ich bis jetzt noch nie eine Bruch Klasse gebraucht.</p>
<p>Kürzer. Wie schon gesagt, kannst du das ja alles in einem schreiben, aber macht imo nicht wirklich Sinn. Vor allem kannst du das Verhalten so an einer Stelle abändern, ohne den + Operator anfassen zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622473</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 28 Nov 2008 14:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 14:04:29 GMT]]></title><description><![CDATA[<p>Nunja, in der Praxis wohl eher nicht. Nur wenn man gerade was ausprobiert oder so... <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>
<p>Ich hab mir auch vor einiger Zeit mal eine Bruchklasse geschrieben, da sind die Methoden für das Verändern von entweder Zähler oder Nenner auch noch drin. Gebracht habe ich die aber nie (könnte aber daran liegen, dass ich die gesamte Bruchklasse kaum zum Einsatz kam). <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>
<p>Die Methode <code>Simplify()</code> kürzt den Bruch, <code>AdaptSign()</code> passt das Vorzeichen an (ist nicht unbedingt nötig, ich wollte halt konsistent, dass nur der Nenner negativ sein kann). Ich hab es halt so gemacht, dass nach jedem Rechenschritt gekürzt wird. Ist zwar von der Performance her nicht optimal, aber so werden die Wertebereiche weniger schnell überschritten. Also, hier mal die Schnittstelle meiner Bruchklasse, damit du dich ungefähr orientieren kannst (ist aber nicht unbedingt optimal, wie gesagt könnte man die Setter für Zähler und Nenner weglassen oder beispielsweise eine Umwandlung <code>ToLongDouble()</code> (oder gleich ein Template) implementieren...</p>
<pre><code class="language-cpp">class Fraction
{
	private:
		long Num;
		long Denom;

	public:
		Fraction(long Numerator = 0, long Denominator = 1);

		void SetFraction(long Numerator, long Denominator);
		void SetNum(long Numerator);
		void SetDenom(long Denominator);
		long GetNum() const;
		long GetDenom() const;
		float ToFloat() const;
		double ToDouble() const;

		Fraction&amp; Fraction::operator+= (const Fraction&amp; Right);
		Fraction&amp; Fraction::operator-= (const Fraction&amp; Right);
		Fraction&amp; Fraction::operator*= (const Fraction&amp; Right);
		Fraction&amp; Fraction::operator/= (const Fraction&amp; Right);

	private:
		void Simplify()
		void AdaptSign()
};
</code></pre>
<p>Zudem sind bei mir noch globale Arithmetik- und Vergleichsoperatoren vorhanden. Ich hab auch Funktionen für kleinstes gemeinsame Vielfache und grössten gemeinsamen Teiler geschrieben, die werden auch intern für das Kürzen verwendet.</p>
<pre><code class="language-cpp">const Fraction operator+ (const Fraction&amp; Frac);
const Fraction operator- (const Fraction&amp; Frac);

const Fraction operator+ (const Fraction&amp; Left, const Fraction&amp; Right);
const Fraction operator- (const Fraction&amp; Left, const Fraction&amp; Right);
const Fraction operator* (const Fraction&amp; Left, const Fraction&amp; Right);
const Fraction operator/ (const Fraction&amp; Left, const Fraction&amp; Right);

bool operator&lt;  (const Fraction&amp; Left, const Fraction&amp; Right);
bool operator&lt;= (const Fraction&amp; Left, const Fraction&amp; Right);
bool operator== (const Fraction&amp; Left, const Fraction&amp; Right);
bool operator&gt;= (const Fraction&amp; Left, const Fraction&amp; Right);
bool operator&gt;  (const Fraction&amp; Left, const Fraction&amp; Right);
bool operator!= (const Fraction&amp; Left, const Fraction&amp; Right);

long GreatestCommonDivisor(long Integer1, long Integer2)
long LeastCommonMultiple(long Integer1, long Integer2)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1622474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622474</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 28 Nov 2008 14:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 14:11:21 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich sehe nicht, warum das die Kapselung stören sollte. Wenn ich einen Zähler, oder Nenner setzen will, dann sollte der auch den Wert bekommen.</p>
</blockquote>
<p>Aber eben genau darum geht es: Wann willst du einzeln einen Nenner oder Zähler setzen, wenn nicht bei der Konstruktion? Und selbst wenn, was würde gegen Methoden dafür sprechen?</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Bei 0 im Nenner kann man sich natürlich streiten, aber imo hat selbst das nichts in einer Bruchklasse zu suchen.</p>
</blockquote>
<p>Ja, ich persönlich habe es halt lieber, die Klassen sicherer zu machen. Also schauen, dass man eine 0 als Nenner gar nie zulässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622479</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 28 Nov 2008 14:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 14:33:44 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Bei 0 im Nenner kann man sich natürlich streiten, aber imo hat selbst das nichts in einer Bruchklasse zu suchen.</p>
</blockquote>
<p>Ja, ich persönlich habe es halt lieber, die Klassen sicherer zu machen. Also schauen, dass man eine 0 als Nenner gar nie zulässt.</p>
</blockquote>
<p>wobei das auch erst zu nem fehler führen würde, wenn man sich den bruch als dezimalwert ausgeben lassen würde... und da kann man ja nen != 0 reinschreiben - sonst sollte man ja nie durch den nenner dividieren müssen!?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622490</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 28 Nov 2008 14:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 14:43:26 GMT]]></title><description><![CDATA[<p>Nein, eigentlich nicht. Aber ich finde es besser, man behandelt den Fehler dort, wo er zu Stande kommt. Ansonsten kann es mühsam werden, ihn zu lokalisieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622495</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 28 Nov 2008 14:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 15:02:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nein, eigentlich nicht. Aber ich finde es besser, man behandelt den Fehler dort, wo er zu Stande kommt. Ansonsten kann es mühsam werden, ihn zu lokalisieren...</p>
</blockquote>
<p>Naja - da es aber nirgendwo passieren dürfte, würd ichs auch nirgendwo prüfen... Ist ja auch egal - ist sicherlich Geschmackssache, ob man nun Setter baut oder die Member öffentlich macht - oder man nur Getter hat (wie ich es ja machen würde)...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622507</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 28 Nov 2008 15:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Typumwandlung on Fri, 28 Nov 2008 16:45:34 GMT]]></title><description><![CDATA[<blockquote>
<p>Bin grad dabei dies zu machen.<br />
+=<br />
*=<br />
usw. mach ich dann auch noch</p>
</blockquote>
<p>Hallo,<br />
du solltest mal boost/operators.hpp anschauen. Der generiert dir automatisch aus z.B. aus dem +=operator den +operator durch ableiten.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622558</guid><dc:creator><![CDATA[Drehleiter]]></dc:creator><pubDate>Fri, 28 Nov 2008 16:45:34 GMT</pubDate></item></channel></rss>