<?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[Anwendbarkeit von C-Funktionen auf Klassen]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Vorsicht ! Der folgenden Quellcode ist eine feine Mischung aus C und C++ und könnte bei so manchen zu einem Wutanfall führen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Könnte bei folgendem Quellecode ein Problem auftauchen ? Ich habe es erfolgreich getestet, jedoch ist es für mich nix anderes als ein Hack.</p>
<pre><code class="language-cpp">class tArrayNode
{
public:
  int a;
  int b;

public:
  tArrayNode();
  int GetSum();
}

tArrayNode::tArrayNode()
{
  this-&gt;a = 0;
  this-&gt;b = 0; 
}

int tArrayNode::GetSum()
{
  return a + b;
}

int CompareArrayNode(const void* a, const void* b)
{
  tArrayNode* node_a = (tArrayNode*) a;
  tArrayNode* node_b = (tArrayNode*) b;

  return node_a-&gt;a &lt; node_b-&gt;a;
}

int main(int argc, char** argv)
{
  tArrayNode array[5];

  // Initialisierung des Arrays
  array[0] = tArrayNode();
  array[1] = tArrayNode();  
  array[2] = tArrayNode();
  array[3] = tArrayNode();  
  array[4] = tArrayNode();
  // Aufruf des Quicksorts auf einer Liste von Objekten
  qsort(array, 5, sizeof(tArrayNode), CompareArrayNode);
  return 0;
}
</code></pre>
<p>Eine Frage leidet sich daraus schnell hervor. Wie funktioniert hier das vertauschen zweier Objekte? Da man beim Aufruf von qsort() die Größe eines Elements angeben muss, schätze ich mal dass die Elemente mittels memcpy() verschoben werden. Und daraus stellt sich mir halt auch die Frage ob man überhaupt Objekte mittels memcpy() verschieben (nicht kopieren) darf.</p>
<p>Und wie macht überhaupt dies eine Liste (std::vector) aus der STL ? Wie werden Listenelemente in der STL verschoben. Einen speraten Kopierkonstruktor, oder einen Kopieroperator, sind nämlich nicht zwingend erforderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215570/anwendbarkeit-von-c-funktionen-auf-klassen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 06:54:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215570.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Jun 2008 14:53:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 14:53:45 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Vorsicht ! Der folgenden Quellcode ist eine feine Mischung aus C und C++ und könnte bei so manchen zu einem Wutanfall führen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Könnte bei folgendem Quellecode ein Problem auftauchen ? Ich habe es erfolgreich getestet, jedoch ist es für mich nix anderes als ein Hack.</p>
<pre><code class="language-cpp">class tArrayNode
{
public:
  int a;
  int b;

public:
  tArrayNode();
  int GetSum();
}

tArrayNode::tArrayNode()
{
  this-&gt;a = 0;
  this-&gt;b = 0; 
}

int tArrayNode::GetSum()
{
  return a + b;
}

int CompareArrayNode(const void* a, const void* b)
{
  tArrayNode* node_a = (tArrayNode*) a;
  tArrayNode* node_b = (tArrayNode*) b;

  return node_a-&gt;a &lt; node_b-&gt;a;
}

int main(int argc, char** argv)
{
  tArrayNode array[5];

  // Initialisierung des Arrays
  array[0] = tArrayNode();
  array[1] = tArrayNode();  
  array[2] = tArrayNode();
  array[3] = tArrayNode();  
  array[4] = tArrayNode();
  // Aufruf des Quicksorts auf einer Liste von Objekten
  qsort(array, 5, sizeof(tArrayNode), CompareArrayNode);
  return 0;
}
</code></pre>
<p>Eine Frage leidet sich daraus schnell hervor. Wie funktioniert hier das vertauschen zweier Objekte? Da man beim Aufruf von qsort() die Größe eines Elements angeben muss, schätze ich mal dass die Elemente mittels memcpy() verschoben werden. Und daraus stellt sich mir halt auch die Frage ob man überhaupt Objekte mittels memcpy() verschieben (nicht kopieren) darf.</p>
<p>Und wie macht überhaupt dies eine Liste (std::vector) aus der STL ? Wie werden Listenelemente in der STL verschoben. Einen speraten Kopierkonstruktor, oder einen Kopieroperator, sind nämlich nicht zwingend erforderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527841</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Thu, 12 Jun 2008 14:53:45 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 14:55:57 GMT]]></title><description><![CDATA[<p>Informier Dich mal zum Stichwort POD. Da Dein Typ ein POD ist, sollte es keine Probleme geben.</p>
<p>Ich frage mich aber, wieso Du überhaupt 'qsort' verwendest und nicht einfach 'sort'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527846</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 12 Jun 2008 14:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:10:08 GMT]]></title><description><![CDATA[<p>Bitte ein Bit schrieb:</p>
<blockquote>
<p>Eine Frage leidet sich daraus schnell hervor. Wie funktioniert hier das vertauschen zweier Objekte? Da man beim Aufruf von qsort() die Größe eines Elements angeben muss, schätze ich mal dass die Elemente mittels memcpy() verschoben werden. Und daraus stellt sich mir halt auch die Frage ob man überhaupt Objekte mittels memcpy() verschieben (nicht kopieren) darf.</p>
</blockquote>
<p>Wenn es sich um PODs handelt. tArrayNode ist <em>kein</em> POD (Konstruktor selbst definiert), somit hast du hier undefiniertes Verhalten.</p>
<blockquote>
<p>Und wie macht überhaupt dies eine Liste (std::vector) aus der STL ? Wie werden Listenelemente in der STL verschoben. Einen speraten Kopierkonstruktor, oder einen Kopieroperator, sind nämlich nicht zwingend erforderlich.</p>
</blockquote>
<p>Jede Klasse hat einen Kopierkonstruktor. Damit eine Klasse als Element eines Containers benutzt werden kann, muss diese Klasse über eine bestimmte Kopiersemantik verfügen, andernfalls resultiert ebenfalls undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527860</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:13:39 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>tArrayNode ist <em>kein</em> POD (Konstruktor selbst definiert)</p>
</blockquote>
<p>Arg, den hatte ich übersehen. <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>/EDIT: Das zeigt vielleicht, wie gefährlich es ist, sich auf sowas zu verlassen. <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/1527863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527863</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:21:45 GMT]]></title><description><![CDATA[<p>Danke,</p>
<p>jetzt weis ich was POD Objekte sind. Ich werde dann wohl oder übel qsort ersetzen müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527874</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:21:45 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:25:02 GMT]]></title><description><![CDATA[<p>Bitte ein Bit schrieb:</p>
<blockquote>
<p>jetzt weis ich was POD Objekte sind. Ich werde dann wohl oder übel qsort ersetzen müssen.</p>
</blockquote>
<p>Hm, ich weiß trotzdem nicht, was daran so schlimm ist. 'sort' ist sowieso effizienter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527877</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:25:02 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:38:41 GMT]]></title><description><![CDATA[<p>Warum ist 'sort' effizienter als qsort ?</p>
<p>Denn der qsort ist meines Erachtens der schnellste Sortieralgorithmus. Schneller sind nur noch Sortieralgorithmen die nicht auf Elementvergleiche basieren. Ein randomisierter Quicksort hat im durchschnittlichen Fall eine Laufzeit von n*log(n).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527895</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:42:35 GMT]]></title><description><![CDATA[<p>Bitte ein Bit schrieb:</p>
<blockquote>
<p>Warum ist 'sort' effizienter als qsort ?</p>
</blockquote>
<p>Zwei Gründe.</p>
<p>Erstens implementiert 'qsort' ein Quicksort, 'sort' hingegen in modernen Implementierungen ein Introsort, welches dieselbe Average-Case-Laufzeit besitzt, aber einen verbesserten Worst Case; und das, ohne ein signifikantes zusätzliches Overhead.</p>
<p>Zweitens ist 'sort' streng typisiert und kann daher die Vergleichsoperation inlinen, wenn sie als Funktor implementiert ist. 'qsort' kann das nicht, sondern muss einen Funktionszeiger aufrufen, was teurer ist.</p>
<blockquote>
<p>Ein randomisierter Quicksort hat im durchschnittlichen Fall eine Laufzeit von n*log(n).</p>
</blockquote>
<p>Den hat ein nicht-randomisierter auch. <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="😉"
    /> Die randomisierte Variante macht nur den Worst-Case (wesentlich) unwahrscheinlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527898</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:50:30 GMT]]></title><description><![CDATA[<p>Danke für die Info.</p>
<p>Da ich den Intro-Sort nicht kenne, werde ich ihn mir wohl noch ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527907</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:50:30 GMT</pubDate></item><item><title><![CDATA[Reply to Anwendbarkeit von C-Funktionen auf Klassen on Thu, 12 Jun 2008 15:54:28 GMT]]></title><description><![CDATA[<p>Bitte ein Bit schrieb:</p>
<blockquote>
<p>Da ich den Intro-Sort nicht kenne, werde ich ihn mir wohl noch ansehen.</p>
</blockquote>
<p>Das ist im wesentlichen dasselbe wie ein Quicksort, allerdings mit einer eingebauten Heuristik, die bestimmen soll, ob für den aktuellen Sortierschritt ein Quicksort überhaupt angebracht ist, oder ob es nicht schneller wäre, stattdessen auf andere Verfahren (meist Heapsort) auszuweichen. Das ist z.B. dann der Fall, wenn nur wenige Elemente übrig sind, oder wenn drei gezielt gewählte Elemente aus der zu sortierenden Sequenz sich bereits in der korrekten Reihenfolge befinden (QuickSorts Worst-Case ist eine bereits sortierte Sequenz).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527911</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 12 Jun 2008 15:54:28 GMT</pubDate></item></channel></rss>