<?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[überladene operatoren - feste anzahl parameter? [SOLVED]]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich bastle gerade an einem Kartenspiel. Es handelt sich um Watten. Das Spiel ist eher unbekannt und wird eigentlich nur an der deutsch-schweizerischen-österreichischen Grenze gespielt. Aber egal.</p>
<p>Um herauszufinden welcher der beiden Spieler einen Stich macht, will ich die 2 Karten(Instanzen der Klasse Karte), die von den Spielern gespielt wurden, miteinander vergleichen.</p>
<p>Hierzu bietet sich es sich ja an den Operator &quot;&lt;&quot; oder &quot;&gt;&quot; zu überladen, da man auch davon spricht, dass eine Karte größer als die andere ist.<br />
Pro Runde wird eine Zahl und eine Farbe von beiden Spieleren &quot;angesagt&quot;. Die Karten dieser Farbe und die Karten dieser Zahl &quot;zählen&quot; dann für diese Runde mehr, haben also einen höheren Wert als die anderen.<br />
Das heißt, die Ordnung der Karten ist nicht statisch sondern änderst sich von Runde zu Runde.</p>
<p>Wenn ich allerdings versuche einen der obne genannten Operatoren zu überladen, bekomme ich folgende Fehlermeldung:</p>
<blockquote>
<p>error: 'bool operator&lt;(Karte, Karte, Karte)' must take exactly two arguments</p>
</blockquote>
<p>Mein Funktionsdefinition sieht so aus:<br />
karte.h</p>
<pre><code>bool operator&lt;(Karte ka1, Karte ka2, Karte ka3){

}
</code></pre>
<p>Den 3ten Parameter der Klasse Karte brauche ich um der Funktion die aktuell &quot;angesagte&quot; Zahl + Farbe zu übermitteln (beides schneidet sich ja genau in einer Karte)</p>
<p>Ich habe die Funktion übrigens NICHT IN der Klasse definiert, um das schon mal vorwegzunehmen. Die Funktion befindet sich zwar im gleichen Header aber schön außerhalb der Klasse.</p>
<p>Daher meine Fräge:<br />
Ist die Anzahl der Eingabeparameter bei Operatoren immer fest, in diesem Fall 2??<br />
Und wenn ja, was mach ich dann am Besten? Den Namen der Funktion ändern und die Funtionalität beibehalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312008/überladene-operatoren-feste-anzahl-parameter-solved</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 02:54:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312008.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Dec 2012 01:02:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 13:57:02 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich bastle gerade an einem Kartenspiel. Es handelt sich um Watten. Das Spiel ist eher unbekannt und wird eigentlich nur an der deutsch-schweizerischen-österreichischen Grenze gespielt. Aber egal.</p>
<p>Um herauszufinden welcher der beiden Spieler einen Stich macht, will ich die 2 Karten(Instanzen der Klasse Karte), die von den Spielern gespielt wurden, miteinander vergleichen.</p>
<p>Hierzu bietet sich es sich ja an den Operator &quot;&lt;&quot; oder &quot;&gt;&quot; zu überladen, da man auch davon spricht, dass eine Karte größer als die andere ist.<br />
Pro Runde wird eine Zahl und eine Farbe von beiden Spieleren &quot;angesagt&quot;. Die Karten dieser Farbe und die Karten dieser Zahl &quot;zählen&quot; dann für diese Runde mehr, haben also einen höheren Wert als die anderen.<br />
Das heißt, die Ordnung der Karten ist nicht statisch sondern änderst sich von Runde zu Runde.</p>
<p>Wenn ich allerdings versuche einen der obne genannten Operatoren zu überladen, bekomme ich folgende Fehlermeldung:</p>
<blockquote>
<p>error: 'bool operator&lt;(Karte, Karte, Karte)' must take exactly two arguments</p>
</blockquote>
<p>Mein Funktionsdefinition sieht so aus:<br />
karte.h</p>
<pre><code>bool operator&lt;(Karte ka1, Karte ka2, Karte ka3){

}
</code></pre>
<p>Den 3ten Parameter der Klasse Karte brauche ich um der Funktion die aktuell &quot;angesagte&quot; Zahl + Farbe zu übermitteln (beides schneidet sich ja genau in einer Karte)</p>
<p>Ich habe die Funktion übrigens NICHT IN der Klasse definiert, um das schon mal vorwegzunehmen. Die Funktion befindet sich zwar im gleichen Header aber schön außerhalb der Klasse.</p>
<p>Daher meine Fräge:<br />
Ist die Anzahl der Eingabeparameter bei Operatoren immer fest, in diesem Fall 2??<br />
Und wenn ja, was mach ich dann am Besten? Den Namen der Funktion ändern und die Funtionalität beibehalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282094</guid><dc:creator><![CDATA[butterbemme]]></dc:creator><pubDate>Fri, 21 Dec 2012 13:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 01:09:42 GMT]]></title><description><![CDATA[<p>butterbemme schrieb:</p>
<blockquote>
<p>Ist die Anzahl der Eingabeparameter bei Operatoren immer fest, in diesem Fall 2??</p>
</blockquote>
<p>Ja. Überleg doch mal wie der Aufruf mit 3 Operatoren aussehen soll?</p>
<p>butterbemme schrieb:</p>
<blockquote>
<p>Und wenn ja, was mach ich dann am Besten? Den Namen der Funktion ändern und die Funtionalität beibehalten?</p>
</blockquote>
<p>Tjoa. Operator &lt; bietet sich hier eigentlich nur bedingt an offen gesagt. Du hast ja wahrscheinlich eine Instanz deines Spiels, die auch die &quot;bevorzugten&quot; Karten kennt. Die bekommt dann halt eine Methode dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282095</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 21 Dec 2012 01:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 01:14:34 GMT]]></title><description><![CDATA[<p>Yeah, schön das noch jemand on is um die Zeit.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>butterbemme schrieb:</p>
<blockquote>
<p>Ist die Anzahl der Eingabeparameter bei Operatoren immer fest, in diesem Fall 2??</p>
</blockquote>
<p>Ja. Überleg doch mal wie der Aufruf mit 3 Operatoren aussehen soll?</p>
</blockquote>
<p>Genau so, wie ichs oben schon gepostet hab <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="😃"
    /> . Hätte ja sein können, dass diese Freiheit in C++ zur Verfügung steht.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>butterbemme schrieb:</p>
<blockquote>
<p>Und wenn ja, was mach ich dann am Besten? Den Namen der Funktion ändern und die Funtionalität beibehalten?</p>
</blockquote>
<p>Tjoa. Operator &lt; bietet sich hier eigentlich nur bedingt an offen gesagt. Du hast ja wahrscheinlich eine Instanz deines Spiels, die auch die &quot;bevorzugten&quot; Karten kennt. Die bekommt dann halt eine Methode dafür.</p>
</blockquote>
<p>Okay, das war uch mein nächster Gedanke. Ich hab aber gehofft, dass es mit Operator &lt; geht, da ich bisher noch nie nen Operator überladen hab und mir die Idee hier so elegant vorkam...auf den ersten Blick zumindest...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282098</guid><dc:creator><![CDATA[butterbemme]]></dc:creator><pubDate>Fri, 21 Dec 2012 01:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 01:21:46 GMT]]></title><description><![CDATA[<p>Willst du den operator jedes mal explizit so aufrufen</p>
<pre><code class="language-cpp">operator&lt; ( thisCard, thatCard, someCard );
</code></pre>
<p>oder wie?</p>
<p>Operatoren sind doch dazu gedacht, dass man eine schöne Syntax hinbekommen, wie :</p>
<pre><code class="language-cpp">Karte card(100);
Karte anotherCard(50);

boolean isSmaller = card &lt; anotherCard;
</code></pre>
<p>und nicht</p>
<pre><code class="language-cpp">Karte card(100);
Karte anotherCard(50);

boolean isSmaller = operator&lt; ( card, anotherCard );
</code></pre>
<p>Was natürlich auch möglich wäre aber irgendwie nicht Sinn der Sache. Wenn du den Operator so aufrufen willst, dann kannst du dir, wie von cooky schon vorgeschlagen, auch einfach direkt eine eigene Methode mit der gewünschten Funktionalität schreiben. Diese könntest du dann korrekt bennenen und der Aufruf wäre um vielfaches intuitiver als der eines operators.<br />
Mal abgesehen davon, dass operator&lt; ein binärer ist ( was auch nur Sinn mach ) und, wie du schon festgestellt hast, der Aufruf mit 3 Parametern nicht geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282100</guid><dc:creator><![CDATA[cvcv]]></dc:creator><pubDate>Fri, 21 Dec 2012 01:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 01:31:21 GMT]]></title><description><![CDATA[<p>so hab ich das noch garnicht betrachtet. Du hast Recht, der Aufruf wäre wie der einer normalen Funktion und kein Stück einfacher</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282101</guid><dc:creator><![CDATA[butterbemme]]></dc:creator><pubDate>Fri, 21 Dec 2012 01:31:21 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 05:51:36 GMT]]></title><description><![CDATA[<p>Die Anzahl der Parameter sowie Precedence und Auswertungrichtung der Operatoren in C++ sind fix, d.h. durch Überladung nicht veränderbar.<br />
Und man kann auch keine neuen Operatoren definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282113</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 21 Dec 2012 05:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 11:41:55 GMT]]></title><description><![CDATA[<p>Du kannst in der class Karte eine static Karte vergleichskarte definieren, die für den Vergleich benutzt wird. Damit brauchst du nur einmal pro Rundenwechsel Karte::vergleichskarte setzen und dein Vergleichsoperator funktioniert.</p>
<p>Es gibt natürlich Probleme wenn du sowas wie std::set&lt;Karte&gt; machst, da das set mit wechselnden Ordnungen nicht klar kommt.</p>
<p>Die bessere Alternative wäre ein Vergleichsobjekt zu bauen.</p>
<pre><code>class Kartenvergleicher{
public:
    Kartenvergleicher(const Karte &amp;k) : vergleichskarte(k){}
    bool operator()(const Karte &amp;k1, const Karte &amp;k2){
        return irgendwieVergleichen(k1, k2, vergleichskarte);
    }
private:
    Karte vergleichskarte;
}
</code></pre>
<p>Damit kann man dann std::sort aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282208</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Fri, 21 Dec 2012 11:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 13:56:40 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten. Werd mir aus euren Vorschlägen was schönes basteln <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/2282239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282239</guid><dc:creator><![CDATA[butterbemme]]></dc:creator><pubDate>Fri, 21 Dec 2012 13:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Fri, 21 Dec 2012 16:20:02 GMT]]></title><description><![CDATA[<p>butterbemme schrieb:</p>
<blockquote>
<p>Danke für eure Antworten. Werd mir aus euren Vorschlägen was schönes basteln <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>
</blockquote>
<p>Bedenke: die Operatoren &gt; und &lt; können nicht alleine an Hand Ihrer Operanden entscheiden, welche Karte sticht.</p>
<p>1. Watten können mehr als zwei Leute spielen, Du mußt also mehere Karten überprüfen.<br />
2. Das Programm muß auch wissen, welche Karte als erstes gelegt wurde, denn wenn kein Trumpf geworfen wurde, stechen nur Karten der gleichen Farbe (Eichel, Schelle, Gras oder Herz)<br />
3. Wie du schon richtig erkannt hast, wird <strong>VOR</strong> dem Spiel eine Trumpffarbe bestimmt (und ich glaube auch Zahl, bin mir aber nicht mehr sicher, hab' schon lange kein Watten mehr gespielt)</p>
<p>Die Instanz einer Karte alleine kann daher nur entscheiden, ob sie grundsätzlich höher ist wie eine andere. Der kannst Du auch die Regeln für Max, Weli und Spitz mitgeben, da diese immer Trumpf sind. Wenn keiner dieser Trümpfe geschlagen hat, muß die Instanz des Spiels an Hand der Trumpffarbe und Zahl und an Hand der ersten Karte entscheiden, welche Karte gestochen hat.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282278</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Fri, 21 Dec 2012 16:20:02 GMT</pubDate></item><item><title><![CDATA[Reply to überladene operatoren - feste anzahl parameter? [SOLVED] on Tue, 25 Dec 2012 20:23:29 GMT]]></title><description><![CDATA[<p>butterbemme schrieb:</p>
<blockquote>
<p>Hiho,<br />
ich bastle gerade an einem Kartenspiel. Es handelt sich um Watten. Das Spiel ist eher unbekannt und wird eigentlich nur an der deutsch-schweizerischen-österreichischen Grenze gespielt. Aber egal.<br />
Um herauszufinden welcher der beiden Spieler einen Stich macht, ...</p>
</blockquote>
<p>Finde es einen lustigen Zufall, dass wir scheinbar zirka zeitgleich das<br />
selbe Spiel ('Watten') programmieren <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>Habe jetzt, nach 8 Tagen und ~1800 Zeilen C/WINAPI - Quelltext, mal eine erste,<br />
rudimentäre Version ins Netz gestellt:</p>
<p><a href="http://www.free-space.at/silvercoat320/Watten.zip" rel="nofollow">http://www.free-space.at/silvercoat320/Watten.zip</a></p>
<p>scheint weitestgehend so zu funktionieren, wie ich es mir vorgenommen hatte.<br />
Der Quelltext ist leider ein Alptraum (hatte Teile davon schon mal<br />
hier im Forum gepostet), ist auch leider nur in 'purem' C und ohne Klassen<br />
oder überladene Operatoren gebastelt worden, deshalb wurde es für einen Troll<br />
gehalten.<br />
Die Funktion, die in meinem Programm berechnet, welcher Spieler sticht,<br />
sieht also z.B. so aus:</p>
<pre><code>/* Gibt 0 zurueck, falls der Ausspieler sticht, andernfalls 1 */
static unsigned getCapture(struct tagMove* move){
	struct Card *first = GodObject-&gt;CardSet + GodObject-&gt;Player[move-&gt;Ausspieler].Cards[move-&gt;AusCardIdx],
		*second = GodObject-&gt;CardSet + GodObject-&gt;Player[move-&gt;Gegenspieler].Cards[move-&gt;GegCardIdx];
	if(first-&gt;rank != GodObject-&gt;valRank){
		if(first-&gt;color != GodObject-&gt;valCol){
			if(second-&gt;color == GodObject-&gt;valCol || second-&gt;rank == GodObject-&gt;valRank)
				return 1u; /* 2. Spieler sticht */
			else if(first-&gt;color != second-&gt;color)
				return 0u; /* 1. Spieler sticht */
			else
				return (first-&gt;rank &gt; second-&gt;rank) ? 0u : 1u; /* Farbstich */
		}
		else if(second-&gt;color != GodObject-&gt;valCol)
			return second-&gt;rank != GodObject-&gt;valRank ? 0u : 1u; /* Trumpf vs. No-Trumpf */
		else{ /* Beide spielten Trumpf */
			if(second-&gt;rank != GodObject-&gt;valRank)
				return (first-&gt;rank &gt; second-&gt;rank) ? 0u : 1u; /* Trumpf vs. Trumpf */
			else
				return 1u; /* 'Die Rechte' sticht immer. */
		}
	}
	if(second-&gt;color != GodObject-&gt;valCol || second-&gt;rank != GodObject-&gt;valRank)
		return 0u; /* Falls zuerst Schlag gespielt wurde, sticht der 1.Spieler, ausser ...*/
	return 1u; /* ... der 2. Spieler spielt 'die Rechte' */
}
</code></pre>
<p>Ist nämlich gar nicht so trivial, speziell in Fällen, wo der 2. Ausspieler<br />
die falsche Farbe draufspielt usw.<br />
Sinngemäß so ähnlich wie diese Funktion<br />
(hab mich bemüht, sie gründlich zu kommentieren!) würde man wohl auch in<br />
C++ irgendwelche Operatoren überladen (hab allerdings NULL Ahnung von C++),<br />
die herausfinden sollen, ob die zuerst oder die als zweites gespielte Karte<br />
sticht.<br />
Im Nachhinein betrachtet war's für mich persönlich eine sehr gute Übung,<br />
das Projekt war weder zu klein, noch zu groß, also gerade richtig, um<br />
sich allmählich beim Programmieren zu verbesseren (immer einen Schritt<br />
nach dem anderen machen, und erst wenn ich mal 'sehr' gut in C bin, trau ich<br />
mich auch mal an das viel umfangreichere und kompliziertere C++ ran, bis dahin -&gt; C)</p>
<p>Viel Erfolg auch mit Deinem eigenen WATTEN, vielleicht kannst ja auch mal<br />
einen Link zu einer 'spielbaren' (muss noch nicht fertig sein!)<br />
Version posten <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>Liebe Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283235</guid><dc:creator><![CDATA[CTroll]]></dc:creator><pubDate>Tue, 25 Dec 2012 20:23:29 GMT</pubDate></item></channel></rss>