<?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[Operatoren in Basisklassen !?]]></title><description><![CDATA[<p>Kann mir jemand erklären, warum der nachfolgende Code nicht funktioniert?</p>
<p>Ich möchte eine abstrakte Basisklasse erstellen, die aufgrund ihrer Verwendung mehrere operator-Funktionen benötigt. Aber die Deklaration haut irgendwie nicht hin und ich verstehe nicht warum...</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual friend bool operator&lt;(const Base&amp;, const Base&amp;) = 0;
};
</code></pre>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286462/operatoren-in-basisklassen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 22:22:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286462.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 May 2011 15:14:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:46:04 GMT]]></title><description><![CDATA[<p>Kann mir jemand erklären, warum der nachfolgende Code nicht funktioniert?</p>
<p>Ich möchte eine abstrakte Basisklasse erstellen, die aufgrund ihrer Verwendung mehrere operator-Funktionen benötigt. Aber die Deklaration haut irgendwie nicht hin und ich verstehe nicht warum...</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual friend bool operator&lt;(const Base&amp;, const Base&amp;) = 0;
};
</code></pre>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061290</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Tue, 10 May 2011 15:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:22:24 GMT]]></title><description><![CDATA[<p>Du definierst den operator&lt; als freie Funktion. Als solche kann sie nicht virtuell und erst recht nicht abstrakt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061291</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 10 May 2011 15:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:29:51 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Du definierst den operator&lt; als freie Funktion. Als solche kann sie nicht virtuell und erst recht nicht abstrakt sein.</p>
</blockquote>
<p>Ok. Und was ist eine freie Funktion? Und wie kann ich es besser machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061295</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Tue, 10 May 2011 15:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:33:36 GMT]]></title><description><![CDATA[<p>Eine freie Funktion ist eine, die keine Memberfunktion einer Klasse ist. Du hast da ja nur eine <code>friend</code> -Deklaration einer Funktion, die irgendwo außerhalb der Klasse definiert sein muss.<br />
Was du besser machen kannst? Keine Ahnung, entweder machst du eine Memberfunktion daraus oder du machst sie nicht virtuell. Kommt drauf an, was du erreichen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061296</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 10 May 2011 15:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:34:27 GMT]]></title><description><![CDATA[<p>ichbineinnoob schrieb:</p>
<blockquote>
<p>Bashar schrieb:</p>
<blockquote>
<p>Du definierst den operator&lt; als freie Funktion. Als solche kann sie nicht virtuell und erst recht nicht abstrakt sein.</p>
</blockquote>
<p>Ok. Und was ist eine freie Funktion? Und wie kann ich es besser machen?</p>
</blockquote>
<p>Frei ist global. Die bekannteste ist:</p>
<pre><code class="language-cpp">int main()
{
    return 0;
}
</code></pre>
<p>Was deinen Code angeht:</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual bool operator&lt;(const Base&amp;)=0;
};
</code></pre>
<p><code>friend</code> weg, den ersten Parameter weg (Methoden übernehmen automatisch einen Parameter auf das aufrufende Objekt, auch <code>this</code> -Zeiger genannt), und es sollte funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061297</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Tue, 10 May 2011 15:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:37:56 GMT]]></title><description><![CDATA[<p>Glühbirne schrieb:</p>
<blockquote>
<p>Was deinen Code angeht:</p>
<pre><code class="language-cpp">class Base
{
public:
	virtual bool operator&lt;(const Base&amp;)=0;
};
</code></pre>
<p><code>friend</code> weg, den ersten Parameter weg (Methoden übernehmen automatisch einen Parameter auf das aufrufende Objekt, auch <code>this</code> -Zeiger genannt), und es sollte funktionieren.</p>
</blockquote>
<p>Das habe ich gerade auch versucht. Nun lautet der Fehler:</p>
<blockquote>
<p>C2259: Instanz von abstrakter Klasse kann nicht erstellt werden</p>
</blockquote>
<p>und das verstehe ich wieder nicht <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=":confused:"
      alt="😕"
    /> <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061299</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Tue, 10 May 2011 15:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:50:05 GMT]]></title><description><![CDATA[<p>Wenn du nicht weißt, was eine abstrakte Klasse ist, solltest du keine definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061302</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 10 May 2011 15:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:51:28 GMT]]></title><description><![CDATA[<p>Wo genau kommt denn der Fehler? Sicherlich nicht in dem Codestückchen. Versuchst du denn jetzt irgendwo ein Objekt dieser Klasse zu instanzieren?</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061304</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 10 May 2011 15:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:59:54 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Wo genau kommt denn der Fehler? Sicherlich nicht in dem Codestückchen. Versuchst du denn jetzt irgendwo ein Objekt dieser Klasse zu instanzieren?</p>
<p>Lg freeG</p>
</blockquote>
<p>Sorry mein vorheriger Text war falsch.</p>
<p>Ich hatte diese Zeile noch stehen:</p>
<pre><code class="language-cpp">map&lt;pair&lt;Base,Base&gt;,Base&gt;
</code></pre>
<p>Ohne diese funktioniert es. (Sorry!)</p>
<p>Kann man keine abstrakten Klassen in std::pair oder std::map benutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061307</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Tue, 10 May 2011 15:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 15:59:02 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Wo genau kommt denn der Fehler?</p>
</blockquote>
<p>+1 für diese unnötige Frage.</p>
<p>Sobald du eine Methode als pure virtual deklarierst, wird dessen Klasse abstrakt. Und abstrakte Klassen können nicht instanziert werden.</p>
<p>Lern zuerst was abstrakte Klassen + Polymorphie ist und dann wende es an. Programmieren ist nicht Chemie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061310</guid><dc:creator><![CDATA[KeinExperementieren]]></dc:creator><pubDate>Tue, 10 May 2011 15:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 16:43:34 GMT]]></title><description><![CDATA[<p>ichbineinnoob schrieb:</p>
<blockquote>
<p>Kann man keine abstrakten Klassen in std::pair oder std::map benutzen?</p>
</blockquote>
<p>Man kann eine abstrakte Klasse nie instanzieren. Es würde ja auch keinen Sinn ergeben. Und Container instanzieren nun mal (klar, oder?). Und wieso sollte man einen Vergleichsoperator rein virtuell machen? Was ergibt das für einen Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061325</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 10 May 2011 16:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 17:04:15 GMT]]></title><description><![CDATA[<p>Vergleichsoperatoren als Memberfunktionen sind (meistens) ungünstig, weil keine impliziten Umwandlungen der linken Seite vorgenommen werden. Etwa wird</p>
<pre><code class="language-cpp">class zahl {
public:
  zahl(int val) : val_(val) { }

  virtual bool operator&lt;(zahl const &amp;rhs) {
    return val_ &lt; rhs.val_;
  }

private:
  int val_;
};

...

zahl z = 2;
if(1 &lt; z) { // Compilerfehler!
}
</code></pre>
<p>nicht funktionieren. Das lässt wie folgt umgehen:</p>
<pre><code class="language-cpp">class zahl {
public:
  zahl(int val) : val_(val) { }

  virtual bool compare(zahl const &amp;rhs) {
    return val_ &lt; rhs.val_;
  }

private:
  int val_;
};

bool operator&lt;(zahl const &amp;lhs, zahl const &amp;rhs) {
  return lhs.compare(rhs);
}

...

zahl z = 2;
if(1 &lt; z) { // kein Problem.
}
</code></pre>
<p>Was es natürlich nicht löst, ist die Problematik doppelt virtueller Funktionen (wenn die Funktionsauswahl anhand der Laufzeittypen beider Parameter erfolgen soll).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061328</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 10 May 2011 17:04:15 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 17:06:31 GMT]]></title><description><![CDATA[<p>Auch wenn ich nicht der Erste bin ...</p>
<p>Warum möchtst du eine <em>abstrakte</em> Klasse erstellen, wenn du vorhast, diese zu <em>instanzieren</em>? Das ist Blödsinn. Aus gutem Grund ist das nicht möglich, die Funktionen besitzen ja keinen Code - das hast du mit der Zuweisung von 0 ja auch deutlich gemacht. Ein Objekt ist so nicht verwendbar.</p>
<p>Weißt du überhaupt, was <code>pure virtual</code> bedeutet? Wenn nicht, weißt du dann, was <code>virtual</code> bedeutet?</p>
<p>PS: Wenn du das ganze als Konstukt mit Basiszeigern auf abgeleitete Objekte einrichten willst, dann verwende Zeiger. Diese benötigen keine Instanzen, weshalb Vorwärtsdeklarationen auch möglich sind:</p>
<pre><code class="language-cpp">class AbstractBaseClass
{
public:
    //Meine Funktionen.
    virtual bool Foo()=0;
    virtual int Bar(int&amp;,int*)=0;
}

int main()
{
    //Das funktioniert nicht:
    AbstractBaseClass Object;

    //Das schon:
    AbstractBaseClass*Pointer;
}
</code></pre>
<p>Aber der Zeiger wird nie auf ein reines <code>AbstractBaseClass</code> -Objekt zeigen, sondern immer auf Objekte abgeleiteter Klassen. Das Konzept nennt sich &quot;Polymorphie&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061332</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Tue, 10 May 2011 17:06:31 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 19:56:41 GMT]]></title><description><![CDATA[<p>KeinExperementieren schrieb:</p>
<blockquote>
<p>fr33g schrieb:</p>
<blockquote>
<p>Wo genau kommt denn der Fehler?</p>
</blockquote>
<p>+1 für diese unnötige Frage.</p>
</blockquote>
<p>Wieso unnötig? Ist mir schon klar dass er versucht hat eine Instanz des ADT zu erstellen, das sollte aber eg aus meinem Post hervorgehen. Ich wollte damit bezwecken, dass er den Codeteil zeigt, wo das vorkommt, damit man ihm dann helfen kann und erklären kann warum das nicht geht und was er vll ändern muss oder ob sein Design komplett falsch ist( was normalerweise der Fall ist, wenn man versucht einen ADT zu instanzieren ).</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061421</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 10 May 2011 19:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Tue, 10 May 2011 22:49:45 GMT]]></title><description><![CDATA[<p>Allen Antwortern und Lesern zunächst einmal vielen Dank!</p>
<p>Auch wenn es nicht so scheint (was an dieser eigensinnigen Programmiersprache liegen muss^^), ich kenne die Grundlagen der objektorientierten Programmierung.<br />
Ich habe lediglich versucht eine std::map zu erstellen, die mehrere Objekte einer abgeleiteten Klasse speichern kann (also Bsp: map&lt;Auto,Auto&gt;, wobei Auto eine abstrakte Basisklasse ist, später speicher ich dann Objekte der Klasse Renault oder Opel in der std::map ab (ein besseres Beispiel fällt mir gerade nicht ein)). Die Basisklasse wiederum sollte quasi ein Interface sein. Das Problem ist nun, dass die std::map die Objekte, die man abspeichern möchte, scheinbar instanziiert (korrigiert mich, wenn ich falsch liege) und das wusste ich einfach nicht (dachte das passiert erst später). Beim kompilieren hat mir Visual 2008 Express dann immer gesagt, dass ich diese und jene Methoden deklarieren (oder war es definieren?) muss, damit die std::map meine Objekte überhaupt speichern kann. Das war/ist mein Problem...</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Man kann eine abstrakte Klasse nie instanzieren. Es würde ja auch keinen Sinn ergeben. <strong>Und Container instanzieren nun mal (klar, oder?)</strong>. Und wieso sollte man einen Vergleichsoperator rein virtuell machen? Was ergibt das für einen Sinn?</p>
</blockquote>
<p>Jetzt ist es mir klar. Danke! Die Vergleichsoperatoren sollte ich nach Compilermeldung halt implementieren, damit ich die Klassen überhaupt in der std::map speichern kann.</p>
<p>Ich glaube ich mache doch besser eine nicht abstrakte Basisklasse, wenn es nicht anders geht. Auch wenn das total blöd aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061477</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Tue, 10 May 2011 22:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Wed, 11 May 2011 08:44:22 GMT]]></title><description><![CDATA[<p>ichbineinnoob schrieb:</p>
<blockquote>
<p>Auch wenn es nicht so scheint (was an dieser eigensinnigen Programmiersprache liegen muss^^), ich kenne die Grundlagen der objektorientierten Programmierung.<br />
Ich habe lediglich versucht eine std::map zu erstellen, die mehrere Objekte einer abgeleiteten Klasse speichern kann (also Bsp: map&lt;Auto,Auto&gt;, wobei Auto eine abstrakte Basisklasse ist, später speicher ich dann Objekte der Klasse Renault oder Opel in der std::map ab (ein besseres Beispiel fällt mir gerade nicht ein)).</p>
</blockquote>
<p>Das funktioniert aber nicht. Die map speichert genau das, was du deklariert hast, also Instanzen von Auto, und nichts anderes.</p>
<blockquote>
<p>Die Basisklasse wiederum sollte quasi ein Interface sein. Das Problem ist nun, dass die std::map die Objekte, die man abspeichern möchte, scheinbar instanziiert (korrigiert mich, wenn ich falsch liege) und das wusste ich einfach nicht (dachte das passiert erst später).</p>
</blockquote>
<p>Der Code, der die Objekte instanziiert, muss ja erzeugt werden, ob du ihn nun später mal aufrufst oder nicht. Du würdest das dann ungefähr so tun (BTW warum ist eigentlich key und value beides Auto?):</p>
<pre><code class="language-cpp">Renault a, b;
meineMap[a] = b;
</code></pre>
<p>Die map kann wohl schlecht die Objekte a und b selbst speichern, sie speichert Kopien davon, und um Kopien anzulegen muss man Objekte instanziieren. Halten wir fest: <code>map&lt;Auto, Auto&gt;</code> muss in der Lage sein, <code>Auto</code> -Instanzen zu erstellen. Und das funktioniert nicht mit abstrakten Klassen.</p>
<p>Zweites Problem, eigentlich viel wichtiger: Angenommen, du würdest die Klasse jetzt konkret machen. Dann würde der Code compilieren, aber wenn du einen Renault einfügst, ist noch lange kein Renault drin, sondern ein Auto. Das Problem nennt sich <strong>Slicing</strong> und ist eigentlich ganz einfach zu verstehen, wenn man sich mal modellhaft folgenden Code anguckt:</p>
<pre><code class="language-cpp">Renault a;
Auto b(a);
</code></pre>
<p>Welchen Typ hat b? Auto natürlich. Der Kopierkonstruktor von Auto wird aufgerufen und kopiert sich nur die Teile heraus, die auch in Auto enthalten sind, alles was es in Renault noch zusätzlich gibt, fällt unter den Tisch.</p>
<p>Wenn du mit Polymorphie willst, musst du mit Zeigern oder Referenzen arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061589</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 11 May 2011 08:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren in Basisklassen !? on Wed, 11 May 2011 13:59:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a>: dank dir für die ausführliche Erklärung! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>(Das mit Auto war nur ein Beispiel um mal zu erläutern was ich prinzipiell meinte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061801</guid><dc:creator><![CDATA[ichbineinnoob]]></dc:creator><pubDate>Wed, 11 May 2011 13:59:38 GMT</pubDate></item></channel></rss>