<?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[Überladen einer Methode]]></title><description><![CDATA[<p>Hallo, ich hab diese Methode</p>
<pre><code class="language-cpp">bool TFunktion::addElement(TElement Element)
{
   // ...
}
</code></pre>
<p>TElement ist ein struct der so aussieht:</p>
<pre><code class="language-cpp">struct TElement  // steht für 1 Element in der Gleichung
                 // Faktor * hatX ^ Exponent
{
   float Faktor;
   float Exponent;

   bool hatX; // wenn die Stelle ein 'x' ist, wird die Var. auf true
              // gesetzt
};
</code></pre>
<p>So, wenn ich jetzt meine Funktion addElement so überladen will, dass ich einmal ein Element mit<br />
Funktion-&gt;addElement( neuesElement ); und mit<br />
Funktion-&gt;addElement( Faktor, Exponent, hatX); hinzufügen kann, schreibt man das am besten?</p>
<p>Ich habs jetzt so:</p>
<pre><code class="language-cpp">bool TFunktion::addElement(float Faktor, float Exponent, bool hatX)
{

   TElement Element = {Faktor, Exponent, hatX};

   return this-&gt;addElement( Element );
}
bool TFunktion::addElement(TElement Element)
{
   // ...
}
</code></pre>
<p>In der obersten Funktion kann man doch bestimmt irgendwie die erste Zeile sparen oder?</p>
<p>Wie schreibt man das am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156470/überladen-einer-methode</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 21:22:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156470.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Aug 2006 20:48:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladen einer Methode on Wed, 16 Aug 2006 20:48:48 GMT]]></title><description><![CDATA[<p>Hallo, ich hab diese Methode</p>
<pre><code class="language-cpp">bool TFunktion::addElement(TElement Element)
{
   // ...
}
</code></pre>
<p>TElement ist ein struct der so aussieht:</p>
<pre><code class="language-cpp">struct TElement  // steht für 1 Element in der Gleichung
                 // Faktor * hatX ^ Exponent
{
   float Faktor;
   float Exponent;

   bool hatX; // wenn die Stelle ein 'x' ist, wird die Var. auf true
              // gesetzt
};
</code></pre>
<p>So, wenn ich jetzt meine Funktion addElement so überladen will, dass ich einmal ein Element mit<br />
Funktion-&gt;addElement( neuesElement ); und mit<br />
Funktion-&gt;addElement( Faktor, Exponent, hatX); hinzufügen kann, schreibt man das am besten?</p>
<p>Ich habs jetzt so:</p>
<pre><code class="language-cpp">bool TFunktion::addElement(float Faktor, float Exponent, bool hatX)
{

   TElement Element = {Faktor, Exponent, hatX};

   return this-&gt;addElement( Element );
}
bool TFunktion::addElement(TElement Element)
{
   // ...
}
</code></pre>
<p>In der obersten Funktion kann man doch bestimmt irgendwie die erste Zeile sparen oder?</p>
<p>Wie schreibt man das am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118744</guid><dc:creator><![CDATA[d0x]]></dc:creator><pubDate>Wed, 16 Aug 2006 20:48:48 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Wed, 16 Aug 2006 20:54:00 GMT]]></title><description><![CDATA[<p>Zum einen solltest Du eine konstante Referenz auf das Element übergeben. Da Du vermutlich bis sicher eine Kopie des übergebenen Parameters in Deine Datenstruktur einfügen wirst (eine Referenz oder ein Zeiger auf ein Argument geht ja schlecht), spart das eine Kopie, nämlich die auf den Stack von addElement.</p>
<pre><code class="language-cpp">bool TFunktion::addElement(const TElement&amp; Element)
</code></pre>
<p>Zum zweiten solltest Du der Struktur TElement einen Konstruktor spendieren, der drei Parameter entgegennimmt. Das ermöglicht Dir dann folgendes:</p>
<pre><code class="language-cpp">bool TFunktion::addElement(float Faktor, float Exponent, bool hatX)
{
   return addElement( TElement( Faktor, Exponent, hatX ) );
}
</code></pre>
<pre><code class="language-cpp">struct TElement
{
   /* ... */
   TElement( float Faktor_, float Exponent_, bool hatX_ ):
      Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ ) {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1118747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118747</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 16 Aug 2006 20:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Wed, 16 Aug 2006 21:34:50 GMT]]></title><description><![CDATA[<p>Wunderbar <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="😉"
    /> Danke für die schnelle antwort.</p>
<p>wie sieht denn dann der Konstruktor für die struktur aus:</p>
<pre><code class="language-cpp">struct TGleichung
{
   TElement Element[N_ELEMENTE];
   float x;
   float a;
};
</code></pre>
<p>Bei der ein Feld initialisiert werden soll (der compilier motzt nämlich gerade das diese Struktur keinen hat (was ja auch so ist).</p>
<p>Vielleicht könntest du auch kurz auf die syntax eingehen. Ich versteh nämlich nicht ganz was der &quot;:&quot; dahinter soll. Oder warte, hier meine Erklärung:</p>
<pre><code class="language-cpp">TElement( float Faktor_, float Exponent_, bool hatX_ )
</code></pre>
<p>Prototyp für den Konstruktor. Die 3 Parameter, geben mir dann die möglichkeit<br />
für die Übergabe(oben).</p>
<pre><code class="language-cpp">: Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ ){}
</code></pre>
<p>Der &quot;:&quot; steht doch jetzt dafür, dass direkt hinter dem Prototyp die Methode stehen soll oder? und die {} sind halt da, weil kein code vorhanden ist.</p>
<p>Ich verstehe allerdings jetzt nicht wie sich das</p>
<pre><code class="language-cpp">Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ )
</code></pre>
<p>in dem Teil des Codes verhält. Hab noch nie hinter eine Variable zwei klammern<br />
geschrieben.</p>
<p>Was ist das, was machst, und wo braucht man das?</p>
<p>Dann noch ne Frage zu derm &quot;_&quot; hinter den benennungen. Ist das ein Standard von C++ Programmieren, sowie das &quot;T&quot; beim anfang von strukturen, für was steht das und wie heißen die Variablen dann (wenns einen sinn hat)?</p>
<p>Danke <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>Edit:<br />
Ich hab gerade in der FAQ das hier gelesen:</p>
<pre><code class="language-cpp">// new statt malloc und Kohorten
Typ* tName= new Typ[Anzahl]; // C++
// und nicht:
// Typ* tName = (Typ*)malloc(Anzahl * sizeof(Typ)); // C
</code></pre>
<p>Hab ich da mit der Feld initialisierung was falsch gemacht (ich meine jetzt bei dem Array in meinem struct)?</p>
<p>Also so neben bei steht im Konstruktor meine Klasse auch nur das drinn:</p>
<pre><code class="language-cpp">TFunktion::TFunktion()
{

   /* Speicherplatz reservieren */
   new TFunktion();

   /* Säubert die eigene Gleichung */
   this-&gt;clearGleichung(Gleichung);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1118755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118755</guid><dc:creator><![CDATA[d0x]]></dc:creator><pubDate>Wed, 16 Aug 2006 21:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Wed, 16 Aug 2006 21:47:08 GMT]]></title><description><![CDATA[<p>Aus Zeitmangel weil die Nacht gleich anbricht gehe ich erstmal nur auf den zweiten Teil ein:</p>
<p>Der Doppelpunkt hinter der Konstruktordeklaration leitet die Initialisierungsliste ein. Dort kannst Du die Membervariablen einer Klasse (oder Struktur) mit Werten konstruieren. Das ist übrigens der bevorzugte Weg, und auch der einzige, wenn ein Member keinen trivialen Konstruktor hat. Bei trivialen Typen ist das dasselbe als würdest Du im Körper des Konstruktors die Werte zuweisen:</p>
<pre><code class="language-cpp">struct TElement
{
   /* ... */
   TElement( float Faktor_, float Exponent_, bool hatX_ )
   {
      Faktor = Faktor_;
      Exponent = Exponent_;
      hatX = hatX_;
   }
};
</code></pre>
<p>Allerdings ist die Initialisierungsliste immer vorzuziehen, da dort ein Wert direkt konstruiert wird. Im Körper wird ein bereits konstruierter Wert mit einem neuen überschrieben.</p>
<p>Der Unterstrich hinter den Namen dient einzig und allein dazu, um die der Klasse (Struktur) zugehörigen Namen von den Parametern zu unterscheiden. Mit Initialisierungsliste wären die Unterstriche nicht einmal nötig, aber ich schreibe sie um Verwirrung zu vermeiden üblicherweise trotzdem hin. In C++ kannst Du übrigens <strong>jeden</strong> Typ mit Klammern initialisieren, statt mit Zuweisung.</p>
<pre><code class="language-cpp">/* Irgendwo im Code, folgendes verhält sich identisch */
int x( 3 );
int x = 3;
</code></pre>
<p>Klarer wird das, wenn Du Klassen verwendest, die keinen Konstruktor mit null Parametern bereitstellen.</p>
<p>Und das T vor Klassennamen ist keinesfalls C++ Standard, sondern imho sogar eher verpönt. Ein durchdachtes Typsystem mit Namespaces braucht keine Ts und Cs um Typen und Klassen zu kennzeichnen. Dass der Unterstrich hinter den Namen gesetzt wird hat hier nur den Grund, dass man sich mit _ oder __ <strong>vor</strong> dem Namen Probleme mit dem Compiler einhandeln kann, denn solche Bezeichner sind u.U. für die Implementation (den Compiler-/Bibliothekshersteller) reserviert.</p>
<p>Kurzes Beispiel zur Initialisierungsliste bei non-trivialen Konstruktoren:</p>
<pre><code class="language-cpp">struct A
{
   A( int x ); // was diese Klasse tut, ist erstmal egal
   // wichtig ist, das folgendes nicht funktioniert, weil der Konstruktor einen Parameter erwartet:
   // A a;
};

struct X
{
   A member_a;
   X( void ) { member_a = A( 12 ); } // funktioniert nicht
   X( void ): member_a( 12 ) {} // ist i.O., denn member_a wird direkt konstruiert
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1118769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118769</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 16 Aug 2006 21:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Wed, 16 Aug 2006 21:49:02 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">TFunktion::TFunktion()
{

   /* Speicherplatz reservieren */
   new TFunktion();

   /* Säubert die eigene Gleichung */
   this-&gt;clearGleichung(Gleichung);
}
</code></pre>
<p>Das solltest Du gleich mal wieder löschen, denn das new TFunktion allokiert Speicher für ein TFunktion, weist diesen Speicher aber keiner Variablen zu <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> das ist toter Speicher, den Du nie wieder erreichen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118770</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 16 Aug 2006 21:49:02 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Thu, 17 Aug 2006 08:57:21 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<pre><code class="language-cpp">TFunktion::TFunktion()
{

   /* Speicherplatz reservieren */
   new TFunktion();

   /* Säubert die eigene Gleichung */
   this-&gt;clearGleichung(Gleichung);
}
</code></pre>
<p>Das solltest Du gleich mal wieder löschen, denn das new TFunktion allokiert Speicher für ein TFunktion, weist diesen Speicher aber keiner Variablen zu <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> das ist toter Speicher, den Du nie wieder erreichen kannst.</p>
</blockquote>
<p>Vor allem im Standardkonstruktor (der dann rekursiv aufgerufen wird) eine prima Sache !! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118963</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 17 Aug 2006 08:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Fri, 18 Aug 2006 09:17:44 GMT]]></title><description><![CDATA[<p>Ok, ich hab mir das gestern abend alles mal durchgelesen und muss sagen, dass eure sprache ganze schön schwer zu verstehen ist. Vorallem verstehe ich das mit den trivialen und non-trivialen Membern nicht. Aber das ihr mir das jeztt erklärt, ist zuviel verlangt. Ich guck mal was sich über google finden läßt. Vielleich könntet ihr mir eure lieblings c++ seite nennen, wo solche infos zufinden sind.</p>
<p>Aber guckt mal hier, ist das Sinnvoll:</p>
<pre><code class="language-cpp">struct TElement
{
   /* ... */
   TElement( float Faktor_, float Exponent_, bool hatX_ ):
      Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ ) {}
};
</code></pre>
<p>Da ich außerhalbt der Klasse öfter mal TElement als eigene Struktur benötige, kann ich doch auch den konstruktor überladen oder?</p>
<pre><code class="language-cpp">struct TElement
{
   /* ... */
   TElement() { TElement( 0.0, 0.0, false };
   TElement( float Faktor_, float Exponent_, bool hatX_ ):
      Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ ) {}
};
</code></pre>
<p>Das das ermöglicht mir doch jetzt dies zu benutzen:</p>
<pre><code class="language-cpp">int main()
{
 /* ... */
   TElement Element; // z.B. zum zwischenspeichern

   TElement ElementenReihe[MAX_ELEMENTS]; // z.B. als einfaches array
 /* ... */
}
</code></pre>
<p>Ist das jetzt irgendwie unsauber? Wofür brauche ich da noch ein <strong>new</strong>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1119656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1119656</guid><dc:creator><![CDATA[d0x]]></dc:creator><pubDate>Fri, 18 Aug 2006 09:17:44 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen einer Methode on Fri, 18 Aug 2006 09:22:22 GMT]]></title><description><![CDATA[<p>d0x schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct TElement
{
   /* ... */
   TElement() { TElement( 0.0, 0.0, false };
   TElement( float Faktor_, float Exponent_, bool hatX_ ):
      Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ ) {}
};
</code></pre>
</blockquote>
<p>Nicht ganz. Du kannst von einem Konstruktor aus nicht den anderen aufrufen. Du kannst es aber so machen:</p>
<pre><code class="language-cpp">struct TElement
{
   /* ... */
   TElement():
      Faktor( 0.0 ), Exponent( 0.0 ), hatX( false ) {}

   TElement( float Faktor_, float Exponent_, bool hatX_ ):
      Faktor( Faktor_ ), Exponent( Exponent_ ), hatX( hatX_ ) {}
};
</code></pre>
<blockquote>
<p>Ist das jetzt irgendwie unsauber? Wofür brauche ich da noch ein <strong>new</strong>?</p>
</blockquote>
<p>Unsauber ist das nicht. Überladung macht es ja gerade möglich, genau sowas zu machen, wieso sollte das dann als unsauber gelten? <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>Das new brauchst Du nur, wenn Du TElemente auf dem <strong>Heap</strong> anlegen willst. Hier in dem Beispiel kommst Du gut ohne aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1119665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1119665</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 18 Aug 2006 09:22:22 GMT</pubDate></item></channel></rss>