<?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[Konstruktor Argumente]]></title><description><![CDATA[<p>Hi,</p>
<p>wie kann eine Klasse, das im Konstruktor ein Argument erhalten hat, dieses Argument als Variable an seine Member-Funktion weitergeben?</p>
<p>Danke und Gruß<br />
Spoogy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272454/konstruktor-argumente</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 21:18:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272454.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Aug 2010 21:44:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor Argumente on Tue, 17 Aug 2010 21:44:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie kann eine Klasse, das im Konstruktor ein Argument erhalten hat, dieses Argument als Variable an seine Member-Funktion weitergeben?</p>
<p>Danke und Gruß<br />
Spoogy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941238</guid><dc:creator><![CDATA[Spoogy]]></dc:creator><pubDate>Tue, 17 Aug 2010 21:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Tue, 17 Aug 2010 21:48:19 GMT]]></title><description><![CDATA[<p><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="😕"
    /><br />
Meinst du sowas?</p>
<pre><code class="language-cpp">class foo
{
public:
    foo(int i)
    {
        tu_was(i);
    }

private:
    void tu_was(int i);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1941240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941240</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Tue, 17 Aug 2010 21:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Tue, 17 Aug 2010 21:48:46 GMT]]></title><description><![CDATA[<p>Ömm, vielleicht habe ich dich jetzt falsch verstanden. Also wenn du das Argument in Memberfunktionen will, dann speichere das Argument als Instanzvariable.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941241</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 17 Aug 2010 21:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Tue, 17 Aug 2010 22:48:59 GMT]]></title><description><![CDATA[<p>Hi, ihr beiden,</p>
<p>hm...joa,ungefähr. Ich meinte sowas hier:</p>
<pre><code class="language-cpp">class foo
{
  public:
    foo(const int _bufferSize)
    {
    }

  private:
    void tu_was()
    {
      int array[_bufferSize];
    }
};
</code></pre>
<p>**<br />
Status:**<br />
Im Moment ist es so, dass die Funktion tu_was() die Variable _bufferSize nicht kennt.</p>
<p><strong>Was will ich machen?</strong><br />
Ich möchte ein Objekt einmal instanziieren und dabei dem Objekt die Puffergröße bekannt machen. Mit dieser Info soll dann die Memberfunktion tu_was arbeiten.<br />
Bisher hatte ich das so, dass ich jedes Mal beim Funktionsaufruf diese Information übergeben habe. Aber das ist redundant, da sich die Puffergröße nach Objektinstanzierung nicht mehr ändert. Daher war meine Überlegung, das geschickterweise dem Konstruktor zu übergeben.</p>
<p>Danke für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941243</guid><dc:creator><![CDATA[Spoogy]]></dc:creator><pubDate>Tue, 17 Aug 2010 22:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Tue, 17 Aug 2010 23:06:41 GMT]]></title><description><![CDATA[<p>Achso. Ein Array auf dem Stack wirst du so aber nicht anlegen können, denn dafür brauchst du eine compile time Konstante. Abhilfe würde z.B. ein std::vector schaffen:</p>
<pre><code class="language-cpp">class foo
{
public:
    foo(int buffer_size) :
        buffer_size(buffer_size)
    {
    }

private:
    size_t const buffer_size;

    void tu_was()
    {
        vector&lt;int&gt; array(buffer_size);
    }
};
</code></pre>
<p>PS: Namen, die mit einem Unterstrich anfangen, sind dem Compiler reserviert. Davon solltest du also die Finger lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941246</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Tue, 17 Aug 2010 23:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Tue, 17 Aug 2010 23:16:56 GMT]]></title><description><![CDATA[<p>Aber jetzt habe ich doch buffer_size doppelt? Einmal im Konstruktor als Argument, und dann hab ich das mir selbst nochmal kopiert in `size_t const buffer_size.</p>
<p>OT:`</p>
<ol>
<li>Was spricht gegen: <code>int array[buffer_size];</code> ?</li>
<li>Was ist denn nun <code>size_t const name</code> ??</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1941248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941248</guid><dc:creator><![CDATA[Spoogy]]></dc:creator><pubDate>Tue, 17 Aug 2010 23:16:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 06:13:39 GMT]]></title><description><![CDATA[<p>Spoogy schrieb:</p>
<blockquote>
<p>Aber jetzt habe ich doch buffer_size doppelt? Einmal im Konstruktor als Argument, und dann hab ich das mir selbst nochmal kopiert in [c]size_t const buffer_size.</p>
</blockquote>
<p>Argumente sind temporär. Beim Aufruf werden die auf den Stack geschoben und nach verlassen der Funktion wieder runter. Wenn Du die Information später noch haben möchtest, musst du sie irgendwo speichern.<br />
Wenn Du für die Klasse verschiedene Compilezeit Konstanten benutzt, kannst Du auch ein Template (wie z.B. [c]std::array&lt;..&gt;[/c]) machen.</p>
<pre><code class="language-cpp">template&lt;int Size&gt;
class foo
{

  int buf[Size];
};
</code></pre>
<p>Wenn der Wert erst zur Laufzeit bekannt ist, musst du ihn nunmal irgendwo für die Lebensdauer der foo Instanz speichern, am sinnvollsten in einer Membervariable. Wenn der Wert für alle Instanzen gilt, kannst du diese auch <code>static</code> deklarieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941279</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 18 Aug 2010 06:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 06:34:45 GMT]]></title><description><![CDATA[<p>Spoogy schrieb:</p>
<blockquote>
<ol>
<li>Was spricht gegen: <code>int array[buffer_size];</code> ?</li>
</ol>
</blockquote>
<p>Illegal (außer buffer_size ist eine zur Compile-Zeit bekannte Konstante)</p>
<p>Spoogy schrieb:</p>
<blockquote>
<ol start="2">
<li>Was ist denn nun <code>size_t const name</code> ??</li>
</ol>
</blockquote>
<p>Ein Datenelement, welches im Konstruktor per Initialisierungsliste gesetzt werden muss und später nicht mehr verändert werden kann. Es ist vom Typ size_t, was ein vorzeichenloser Ganzzahltyp ist, der groß genug ist, die Anzahl der Bytes des größten zusammenhängenden Blocks im Speicher zu speichern.</p>
<p>Das ist wahrscheinlich auch nicht Deine letzte Frage zu C++. Daher würde ich Dir raten, ein schlaues C++ Buch zu besorgen, in dem Du die Grundlagen einfach nachlesen kannst. Das ist <em>viel</em> besser (für <em>alle</em> Beteiligten), als Dir von Forenmitgliedern C++ beibringen zu lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941283</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 18 Aug 2010 06:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 13:33:23 GMT]]></title><description><![CDATA[<p>Vielen Dank</p>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Argumente sind temporär. Beim Aufruf werden die auf den Stack geschoben und nach verlassen der Funktion wieder runter. Wenn Du die Information später noch haben möchtest, musst du sie irgendwo speichern.</p>
</blockquote>
<p>Ja, ich dachte fälschlicherweise, der Konstruktor stelle eine Ausnahme dar und behandelt Argumente wie Membervariablen anstatt wie lokale Variablen. Aber das ist Käse.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Spoogy schrieb:</p>
<blockquote>
<ol>
<li>Was spricht gegen: <code>int array[buffer_size];</code> ?</li>
</ol>
</blockquote>
<p>Illegal (außer buffer_size ist eine zur Compile-Zeit bekannte Konstante)</p>
</blockquote>
<p>Ach ja, klar!<br />
Ich habe es jetzt mit einem Pointer gelöst, da dieser zur Laufzeit Speicher dynamisch zugewiesen bekommen kann:<br />
<code>int* MyArray = new int [buffer_size];</code></p>
<p>Jetzt habe ich eine <strong>Frage zum <code>delete[]</code> -Befehl:</strong><br />
Das erste Element meines Arrays habe ich mit <code>MyArray[0] = 999;</code> auf den Wert 999 initialisiert.<br />
Nun habe ich meinen Pointer mit <code>*++MyArray = 123;</code> auf die nächste Speicheradresse (seines Types) inkrementiert und den Inhalt an dieser Stelle auf den Wert 123 gesetzt.<br />
Leider kann ich jetzt den Speicher mit <code>delete [] MyArray</code> nicht freigeben.<br />
Ich erhalte:</p>
<blockquote>
<p>Debug Assertion Failed! (...) Expression: _BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse)</p>
</blockquote>
<p>Das gleiche geschieht auch dann, wenn ich nur den Pointer inkrementiere ohne einen Wert in die Adresse zu speichern (also nur ++MyArray)</p>
<p>Warum ist das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941559</guid><dc:creator><![CDATA[Spoogy]]></dc:creator><pubDate>Wed, 18 Aug 2010 13:33:23 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 13:42:57 GMT]]></title><description><![CDATA[<p>Spoogy schrieb:</p>
<blockquote>
<p>Ich habe es jetzt mit einem Pointer gelöst, da dieser zur Laufzeit Speicher dynamisch zugewiesen bekommen kann:<br />
<code>int* MyArray = new int [buffer_size];</code></p>
</blockquote>
<p>Darf ich fragen, warum du kein std::vector nehmen willst? Da musst du dich weder um die Allokation noch Freigabe kümmern? (Zumal er sich besser in C++ einfügt als ein C-Array).</p>
<p>Wenn du mit dem vector arbeitest sparst du dir unter anderem die Notwendigkeit einen eigenen Kopierkonstruktor und Zuweisungsoperator schreiben zu müssen, was du bei Zeigern tun musst - zumal du bei der Zeigerarithmetik wohl einige Probleme hast...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941570</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 18 Aug 2010 13:42:57 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 13:45:58 GMT]]></title><description><![CDATA[<p>Der Zeiger auf den du delete[] aufrufst muss auf den Anfang eines durch new allokierten Block zeigen. Vor deinen eigentlichen Daten befinden sich dort z.B. Informationen, wie groß dieser Block ist. Diese Information braucht delete[] natürlich, um zu wissen wieviel gelöscht werden muss.<br />
Benutze statt dem Array lieber einen std::vector&lt;int&gt;, dann musst du dir um solche sachen keine Gedanken machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941574</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 18 Aug 2010 13:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 20:17:43 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Der Zeiger auf den du delete[] aufrufst muss auf den Anfang eines durch new allokierten Block zeigen. Vor deinen eigentlichen Daten befinden sich dort z.B. Informationen, wie groß dieser Block ist. Diese Information braucht delete[] natürlich, um zu wissen wieviel gelöscht werden muss.</p>
</blockquote>
<p>Danke, das wollte wissen.<br />
D.h., man müsste vor dem Freigeben den Zeiger wieder auf seine ursprüngliche Adresse setzen.</p>
<p>asc schrieb:</p>
<blockquote>
<p>Darf ich fragen, warum du kein std::vector nehmen willst? Da musst du dich weder um die Allokation noch Freigabe kümmern? (Zumal er sich besser in C++ einfügt als ein C-Array).</p>
</blockquote>
<p>Aus Performancegründen. Baue eine Echtzeitanwendung im Bereich der Audiosignalverarbeitung in Form eines VST-Plug-Ins.<br />
Aber wenn std::vector keine Geschwindigkeitseinbußen mit sich bring werd ich das mir gerne anschauen. Ich wollte nur meine Theorie wieder auffrischen. Daher meine Fragen.</p>
<p>asc schrieb:</p>
<blockquote>
<p>(...)zumal du bei der Zeigerarithmetik wohl einige Probleme hast...</p>
</blockquote>
<p>Welche denn genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941752</guid><dc:creator><![CDATA[Spoogy]]></dc:creator><pubDate>Wed, 18 Aug 2010 20:17:43 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor Argumente on Wed, 18 Aug 2010 20:36:03 GMT]]></title><description><![CDATA[<p>Spoogy schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Darf ich fragen, warum du kein std::vector nehmen willst? Da musst du dich weder um die Allokation noch Freigabe kümmern? (Zumal er sich besser in C++ einfügt als ein C-Array).</p>
</blockquote>
<p>Aus Performancegründen.</p>
</blockquote>
<p>Solange du den vector richtig initialisierst (z.B. durch ein reserve-Aufruf wenn du mit push_back, oder dich eines entsprechenden Konstruktoraufrufes bedienst [z.B. einen mir der Anzahl und dem Standardwert] für einen direkten Indexzugriff), ist der std::vector von der Geschwindigkeit her ziemlich identisch mit einem dynamisch allozierten Array (sofern der Hersteller der STL nicht geschlammt hat).</p>
<p>Spoogy schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>(...)zumal du bei der Zeigerarithmetik wohl einige Probleme hast...</p>
</blockquote>
<p>Welche denn genau?</p>
</blockquote>
<p>Unter anderem im Bezug mit delete. Zumal ich niemals den Ausgangszeiger direkt manipulieren würde (Da du diesen ggf. mehrmals braucht). Und wenn du schon über Indexzugriff arbeitest, warum überhaupt noch iterieren?</p>
<p>Zudem hoffe ich dennoch das du dir auch die von mir erwähnten Probleme im Bezug mit Zeigern &amp; Klassen anschaust (Du musst entweder den Kopierkonstrzuktor und Zuweisungsoperator unterbinden, in dem du diese im private-Bereich deklarierst, aber niemals definierst, oder sie händisch schreiben; der std::vector wiederum kopiert sich selbstständig).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941762</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 18 Aug 2010 20:36:03 GMT</pubDate></item></channel></rss>