<?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[Operatorüberladung für &#x2F; mit 2 Argumenten]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab als Anfänger mal eine (ich denke) eher simple Frage. Hab auf die schnelle nichts in der FAQ gefunden, deshalb poste ich mal.</p>
<p>Also ich hab die Klasse Bruch definiert und will jetzt sowas in der Art schreiben können:</p>
<p>Bruch b;<br />
b=5/6;</p>
<p>Da macht der GCC nur leider nicht mit... hier ist der ganze Quelltext:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using std::cin;
using std::cout;
using std::endl;

template &lt;class T&gt;

class vector
{
	private:
		int m_anz_elemente;
		T *p;
	public:
		vector(int anz_elemente)
		{
			m_anz_elemente = anz_elemente;
			p = new T[m_anz_elemente];
		};
	T &amp;operator[](int index)
	{
		return p[index];
	};

	void ausgabe(int index)
	{
		cout &lt;&lt; p[index] &lt;&lt; endl;
	};
};

class Bruch
{
	private:
		int m_zaehler;
		int m_nenner;
	public:
		Bruch(int zaehler, int nenner)
		{
			m_zaehler = zaehler;
			m_nenner = nenner;
		};
		Bruch()
		{m_zaehler = 0;
		 m_nenner = 0;
		};

		Bruch operator = (Bruch val)
		{
			return val;
		};
};
	Bruch operator /(int z, int d)
	{
		Bruch d(z, d);
		return d;
	}

int main()
{
	cout &lt;&lt; &quot;Hello World!&quot; &lt;&lt; endl;
	int a = 3;
	Bruch b(5, 6);
	vector &lt;int&gt; v1(a);
	vector &lt;Bruch&gt; b1(5);
	b1[5] = (5/6)
	cout &lt;&lt; v1[1] &lt;&lt; endl;
	return 0;
};
</code></pre>
<p>Ich hoff irgendjemand findet sich da drin zurecht :-). Das Problem ist halt, dass ich auf jeden Fall 2 Argumente für die Funktion &quot;Operator /&quot; haben muss. Der Compiler meckert dann aber:</p>
<p>52: error: ‘Bruch operator/(int, int)’ must have an argument of class or enumerated type</p>
<p>Tja und was das heißen soll weiß ich auch nicht....</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169968/operatorüberladung-für-mit-2-argumenten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 23:13:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169968.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Jan 2007 15:42:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatorüberladung für &#x2F; mit 2 Argumenten on Wed, 10 Jan 2007 15:42:10 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab als Anfänger mal eine (ich denke) eher simple Frage. Hab auf die schnelle nichts in der FAQ gefunden, deshalb poste ich mal.</p>
<p>Also ich hab die Klasse Bruch definiert und will jetzt sowas in der Art schreiben können:</p>
<p>Bruch b;<br />
b=5/6;</p>
<p>Da macht der GCC nur leider nicht mit... hier ist der ganze Quelltext:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using std::cin;
using std::cout;
using std::endl;

template &lt;class T&gt;

class vector
{
	private:
		int m_anz_elemente;
		T *p;
	public:
		vector(int anz_elemente)
		{
			m_anz_elemente = anz_elemente;
			p = new T[m_anz_elemente];
		};
	T &amp;operator[](int index)
	{
		return p[index];
	};

	void ausgabe(int index)
	{
		cout &lt;&lt; p[index] &lt;&lt; endl;
	};
};

class Bruch
{
	private:
		int m_zaehler;
		int m_nenner;
	public:
		Bruch(int zaehler, int nenner)
		{
			m_zaehler = zaehler;
			m_nenner = nenner;
		};
		Bruch()
		{m_zaehler = 0;
		 m_nenner = 0;
		};

		Bruch operator = (Bruch val)
		{
			return val;
		};
};
	Bruch operator /(int z, int d)
	{
		Bruch d(z, d);
		return d;
	}

int main()
{
	cout &lt;&lt; &quot;Hello World!&quot; &lt;&lt; endl;
	int a = 3;
	Bruch b(5, 6);
	vector &lt;int&gt; v1(a);
	vector &lt;Bruch&gt; b1(5);
	b1[5] = (5/6)
	cout &lt;&lt; v1[1] &lt;&lt; endl;
	return 0;
};
</code></pre>
<p>Ich hoff irgendjemand findet sich da drin zurecht :-). Das Problem ist halt, dass ich auf jeden Fall 2 Argumente für die Funktion &quot;Operator /&quot; haben muss. Der Compiler meckert dann aber:</p>
<p>52: error: ‘Bruch operator/(int, int)’ must have an argument of class or enumerated type</p>
<p>Tja und was das heißen soll weiß ich auch nicht....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207204</guid><dc:creator><![CDATA[rocky16]]></dc:creator><pubDate>Wed, 10 Jan 2007 15:42:10 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung für &#x2F; mit 2 Argumenten on Wed, 10 Jan 2007 16:01:06 GMT]]></title><description><![CDATA[<p>Also...</p>
<p>Der Operator / ist ein binärer Operator, sprich er besitzt 2 Operanden.<br />
Wenn du in deiner Klasse den Operator überlädtst, ist der 1.Operand automatisch die aufgerufene Klasseninstanz.<br />
In menschlichen Worten:<br />
Wenn ich schreibe ob1 / ob2, dann wird der Funktion (in der Klasse &quot;Ob&quot;)<br />
Ob Ob::operator/(Ob objekt)<br />
ob1 als erster Operand übergeben. (Wenn dus genau wissen willst: And die Funktion wird ob1 über den impliziten this-Zeiger übergeben. Also im obigen Bsp. wird an die Funktion übergeben: this, ob2 (&lt;-nicht ganz richtig) , wobei this einfach der linke Operand ist. Es wird immer der linke Operand per this übergeben. )</p>
<p>Das heißt, deine Funktionsdefinition wird nie funktionieren, weil die Funktion mit operator/ immer als linken Operanden ein Objekt der Klasse Bruch erwarten wird.</p>
<p>Bei deinem Beispiel müsstest du den int-operator/ überladen, und ich zweifle, dass das möglich ist.</p>
<p>Du könntest höchstens den operator= für double überladen, und irgendwie schaun, dass du die double mit einer Zahl multiplizierst, bis du zwei ganze Zahlen hast, und die dann in m_zaehler und m_nenner speicherst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207225</guid><dc:creator><![CDATA[ne0r]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung für &#x2F; mit 2 Argumenten on Wed, 10 Jan 2007 16:18:50 GMT]]></title><description><![CDATA[<p>Du könntest auch operator= für char* überladen, damit du sowas machen kannst</p>
<pre><code class="language-cpp">Bruch zahl = &quot;5/6&quot;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1207242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207242</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung für &#x2F; mit 2 Argumenten on Wed, 10 Jan 2007 18:05:27 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Du könntest auch operator= für char* überladen, damit du sowas machen kannst</p>
<pre><code class="language-cpp">Bruch zahl = &quot;5/6&quot;;
</code></pre>
</blockquote>
<p>Mit dem Bsp. meinst du wohl eher den Copy-C'tor <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>rocky16 schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">Bruch operator /(int z, int d)
{
        Bruch d(z, d);
        return d;
}
</code></pre>
<p>...</p>
</blockquote>
<p>Das kann nicht funktionieren, da du hier versuchst die Bedeutung von op/ für einegebaute Datentypen (int) zu ändern ...</p>
<p>Du müsstest schon einen Konstruktor bereitstellen der &quot;x/y&quot; annimmt.<br />
Aber dann auch auf implizte Umwandlung aufpassen.</p>
<p>Besser wäre es dann doch es so zu schreiben:</p>
<pre><code class="language-cpp">b1[0] = Bruch(x,y);
</code></pre>
<p>Ist meiner Meinung am sichersten und irgendwie auch schöner als &quot;x/y&quot; in nem Programm zu schreiben <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>Eine ganz andere Möglichkeit wäre einen Bruch(double z) Konstruktor bereitzustellen und dir dann da aus der Dezimalzahl einen Bruch zu machen.</p>
<p>Dann würde auch sowas wie b1[9] = 4/6; funktionieren, aber dann kommt wieder die Sache mit Implizierter Typumwandlung...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207332</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 10 Jan 2007 18:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung für &#x2F; mit 2 Argumenten on Thu, 11 Jan 2007 07:21:10 GMT]]></title><description><![CDATA[<p>Freak_Coder schrieb:</p>
<blockquote>
<p>Eine ganz andere Möglichkeit wäre einen Bruch(double z) Konstruktor bereitzustellen und dir dann da aus der Dezimalzahl einen Bruch zu machen.</p>
<p>Dann würde auch sowas wie b1[9] = 4/6; funktionieren, aber dann kommt wieder die Sache mit Implizierter Typumwandlung...</p>
</blockquote>
<p>Sagen wir es mal so: Es würde compilieren - aber nicht das richtige Ergebnis liefern. (4/6 wird per int-Arithmetik verrechnet, liefert also 0)</p>
<p>Zum eigentlichen Thema: Wie schon gesagt kannst du Operatoren nur dann überladen, wenn eine deiner eigenen Klassen daran beteiligt ist. Der operator/ für int-Werte ist schon vom Compiler vorgegeben (der liefert einen int) und kann nicht ersetzt werden.</p>
<p>PS: Anstatt eine eigene vector-Klasse zu schreiben solltest du lieber std::vector&lt;&gt; verwenden <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>PPS: Und die Ctor'en der Bruch-Klasse würde ich zusammenfassen zu:</p>
<pre><code class="language-cpp">Bruch(int z=0,int n=1) : m_zaehler(z),m_nenner(n) {}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1207629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207629</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 Jan 2007 07:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung für &#x2F; mit 2 Argumenten on Thu, 11 Jan 2007 14:19:33 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Es würde compilieren - aber nicht das richtige Ergebnis liefern. (4/6 wird per int-Arithmetik verrechnet, liefert also 0)</p>
</blockquote>
<p>Sry stimmt. Habe ich nicht beachtet <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1207968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207968</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 11 Jan 2007 14:19:33 GMT</pubDate></item></channel></rss>