<?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[Konstante in Klasse übergeben]]></title><description><![CDATA[<p>Hallo!<br />
So, mein Programm läuft erstmal, aber ich wollte den Code noch etwas schöner machen. Dabei stoß ich allerdings an meine Grenzen: Ich habe eine Konstante, mit der ich per Konstruktor eine Variable einer Klasse initialisiere:</p>
<pre><code class="language-cpp">Fft kugel(FFT_LAENGE);
</code></pre>
<p>und der Konstruktor:</p>
<pre><code class="language-cpp">Fft(const long konstr_laenge):LAENGE(konstr_laenge){
 }

...

long LAENGE;
</code></pre>
<p>Innerhalb der Klasse bräuchte ich die Variable eigentlich auch nur als Konstante, aber mir fällt keine Möglichkeit ein, diese Konstante dann Klassenweit zur Verfügung zu stellen. Das eigentliche Problem ist jetzt, das ich innerhalb der Klasse Fft Variablen habe, welche LAENGE für ihre Definition als Konstante benötigen. Also z.B:</p>
<pre><code class="language-cpp">double data[LAENGE];
</code></pre>
<p>Solang LAENGE eine Variable ist, beschwert sich der Compiler (verständlicherweise), das er mir mit der Variablen kein Feld baut. Was macht man in so einem Fall? Oder ist mein Konzept einfach zu mies? Sämtliche cast und Pointerideen, die ich bis jetzt hatte, sind gescheitert. Weiß schon gar nicht mehr, was ich alles versucht habe...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221034/konstante-in-klasse-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 12:12:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221034.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Aug 2008 22:17:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Sun, 24 Aug 2008 22:31:45 GMT]]></title><description><![CDATA[<p>Hallo!<br />
So, mein Programm läuft erstmal, aber ich wollte den Code noch etwas schöner machen. Dabei stoß ich allerdings an meine Grenzen: Ich habe eine Konstante, mit der ich per Konstruktor eine Variable einer Klasse initialisiere:</p>
<pre><code class="language-cpp">Fft kugel(FFT_LAENGE);
</code></pre>
<p>und der Konstruktor:</p>
<pre><code class="language-cpp">Fft(const long konstr_laenge):LAENGE(konstr_laenge){
 }

...

long LAENGE;
</code></pre>
<p>Innerhalb der Klasse bräuchte ich die Variable eigentlich auch nur als Konstante, aber mir fällt keine Möglichkeit ein, diese Konstante dann Klassenweit zur Verfügung zu stellen. Das eigentliche Problem ist jetzt, das ich innerhalb der Klasse Fft Variablen habe, welche LAENGE für ihre Definition als Konstante benötigen. Also z.B:</p>
<pre><code class="language-cpp">double data[LAENGE];
</code></pre>
<p>Solang LAENGE eine Variable ist, beschwert sich der Compiler (verständlicherweise), das er mir mit der Variablen kein Feld baut. Was macht man in so einem Fall? Oder ist mein Konzept einfach zu mies? Sämtliche cast und Pointerideen, die ich bis jetzt hatte, sind gescheitert. Weiß schon gar nicht mehr, was ich alles versucht habe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570726</guid><dc:creator><![CDATA[Fledi]]></dc:creator><pubDate>Sun, 24 Aug 2008 22:31:45 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Sun, 24 Aug 2008 22:50:31 GMT]]></title><description><![CDATA[<p>Du brauchst nicht nur eine Konstante, sondern eine statische Konstanten.</p>
<pre><code class="language-cpp">class Fft {
static const long LAENGE = 2;

long a[LAENGE];
}
</code></pre>
<p>Somit kannst du die Länge nicht für jedes Objekt mitangeben.<br />
Aber was du machen kannst, ist dir mal std::vector anschauen. Da stellt sich diese Frage gar nicht erst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570735</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 24 Aug 2008 22:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 01:11:35 GMT]]></title><description><![CDATA[<blockquote>
<p>Innerhalb der Klasse bräuchte ich die Variable eigentlich auch nur als Konstante, aber mir fällt keine Möglichkeit ein, diese Konstante dann Klassenweit zur Verfügung zu stellen.</p>
</blockquote>
<pre><code class="language-cpp">class Fft
{
    public:
        Fft(const long konstr_laenge):LAENGE(konstr_laenge){ }
    private:
        const long LAENGE;    // nun ist die Variable Klassenweit bekannt
}
</code></pre>
<blockquote>
<p>Solang LAENGE eine Variable ist, beschwert sich der Compiler (verständlicherweise), das er mir mit der Variablen kein Feld baut. Was macht man in so einem Fall?</p>
</blockquote>
<p>einen pointer nehmen <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>Sämtliche cast und Pointerideen, die ich bis jetzt hatte, sind gescheitert.</p>
</blockquote>
<p>Es wäre sicherlich amüsant diese zu sehen <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="🙂"
    /><br />
warum nicht so:</p>
<pre><code class="language-cpp">double data = new double( LAENGE );
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570750</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Mon, 25 Aug 2008 01:11:35 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 03:49:12 GMT]]></title><description><![CDATA[<p>double *T schrieb:</p>
<blockquote>
<p>Fledi schrieb:</p>
<blockquote>
<p>Sämtliche cast und Pointerideen, die ich bis jetzt hatte, sind gescheitert.</p>
</blockquote>
<p>Es wäre sicherlich amüsant diese zu sehen <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>Wer im Glashaus sitzt... SCNR</p>
<p>double *T schrieb:</p>
<blockquote>
<p>warum nicht so:</p>
<pre><code class="language-cpp">double data = new double( LAENGE );
</code></pre>
<p>?</p>
</blockquote>
<p>Weil's quatsch ist? Damit bekämst Du - wenn sich der Compiler *denken würde*, dass <code>data</code> ein Pointer ist, 1 (in Worten: eine) <code>double</code> die mit <code>LAENGE</code> initialisiert wird.</p>
<p>warum nicht so:</p>
<pre><code class="language-cpp">double *data( new double[ LAENGE ] );

// oder wahlweise natürlich:

double *data = new double[ LAENGE ];
</code></pre>
<p>?</p>
<p>cheers, Swordfish</p>
<p>PS: <div class="plugin-markdown"><input type="checkbox" id="checkbox68833" /><label for="checkbox68833">data;</label></div> nicht vergessen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570755</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 25 Aug 2008 03:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 09:05:01 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Antworten. Das bringt mich auf jeden Fall ein Stück weiter.</p>
<p>@ drakon: Static bringt leider nix, weil ich den Wert von LAENGE auf jeden Fall von außen kriege. Und wenn ich eine Variable im Konstruktor als static deklariere, bleibt sie zwar erhalten, steht mir aber außerhalb des Konstruktors nicht zur Vefügung...<br />
Aber std::vector sieht ganz gut aus. Warscheinlich wirds das werden...</p>
<p>@double *T:</p>
<blockquote>
<pre><code class="language-cpp">class Fft
{
    public:
        Fft(const long konstr_laenge):LAENGE(konstr_laenge){ }
    private:
        const long LAENGE;    // nun ist die Variable Klassenweit bekannt
}
</code></pre>
</blockquote>
<p>Gut, hier hatte ich mich falsch ausgedrückt. Das war mein allererster Ansatz. Nur das er mir dann eben eine &quot;ungültige Verwendung des nicht-statischen Datenelementes &quot;FFT::LAENGE&quot; &quot; zurückgibt, sobald ich meine Felder basteln will...</p>
<blockquote>
<p>Es wäre sicherlich amüsant diese zu sehen <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>Nö <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>@ swordfish:</p>
<blockquote>
<p>warum nicht so:</p>
<pre><code class="language-cpp">double *data( new double[ LAENGE ] );

// oder wahlweise natürlich:

double *data = new double[ LAENGE ];
</code></pre>
<p>?</p>
</blockquote>
<p>Öhmm...wär ja schön gewesen, aber nein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Ich will nicht sagen, das ch es hundertprozentig verstehe, aber wenn ich das so definiere, sagt er mir &quot;Fft::LAENGE kann nicht in Konstanten-Ausdruck auftreten&quot;<br />
und &quot;'new' kann nicht in Konstanten-Ausdruck auftreten&quot;, egal ob ich LAENGE als const definiere oder nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570863</guid><dc:creator><![CDATA[Fledi]]></dc:creator><pubDate>Mon, 25 Aug 2008 09:05:01 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 09:10:02 GMT]]></title><description><![CDATA[<p>Dann schreib halt nur double *data; und im Konstruktor (wo du Laenge ja hast) data = new double[LAENGE]; und im Destruktor entsprechend delete[] data;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570867</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 25 Aug 2008 09:10:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 09:17:02 GMT]]></title><description><![CDATA[<blockquote>
<p>@ drakon: Static bringt leider nix, weil ich den Wert von LAENGE auf jeden Fall von außen kriege. Und wenn ich eine Variable im Konstruktor als static deklariere, bleibt sie zwar erhalten, steht mir aber außerhalb des Konstruktors nicht zur Vefügung...<br />
Aber std::vector sieht ganz gut aus. Warscheinlich wirds das werden...</p>
</blockquote>
<p>Bitteschön:</p>
<pre><code class="language-cpp">class foo 
{
public:
	foo (int n)
		:a (new int [n] )
	{
	}
	~foo ()
	{
		delete [] a;
	}

private:
	int* a;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1570874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570874</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 25 Aug 2008 09:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 09:38:08 GMT]]></title><description><![CDATA[<p>Copy-ctor und Zuweisung immer gleich mit dazu.</p>
<pre><code class="language-cpp">class foo
{
public:
    explicit foo (int n)
        :n_(n), a_(new int [n]())
    {
    }
    ~foo ()
    {
        delete [] a;
    }
    foo (const foo&amp; other)
        :n_(other.n_), a_(new int [other.n_])
    {
        std::copy( other.a_, other.a_ + n_, a_ );
    }
// fehleranfällig und dupliziert Code:
/*    foo&amp; operator=(const foo&amp; rhs)
    {
        int* p = new int [other.n_];
        std::copy( other.a_, other.a_ + other.n_, p );
        n_ = other.n_;
        delete [] a_;
        a_ = p;
        return *this;
    }*/
// einfach(er und) besser
    foo&amp; operator=(foo rhs)
    {
        swap( rhs );
        return *this;
    }
    void swap(foo&amp; other)
    {
        std::swap( n_, other.n_ );
        std::swap( a_, other.a_ );
    }
private:
    int n_;
    int* a_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1570894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570894</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 25 Aug 2008 09:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 09:53:13 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">foo&amp; operator=(foo rhs)
    {
        swap( rhs );
        return *this;
    }
</code></pre>
</blockquote>
<p>Warum machst du es auf die Art? Ist imho nicht so schnell als copy&amp;swap zu erkennen, wie auf die andere Art mit der Kopie im inneren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570910</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 25 Aug 2008 09:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 09:53:43 GMT]]></title><description><![CDATA[<p>Wenn das Array in seiner Länge zur Compilezeit auf jeden Fall bekannt ist, und die Länge sich auch zur Laufzeit nicht ändern wird, kann man auch ein Template nehmen:</p>
<pre><code class="language-cpp">template&lt;size_t LENGTH&gt;
class Ftw
{
public:
    //...
private:
    double data[LENGTH];
};

//...
Ftw&lt;128&gt; ftw
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1570911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570911</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 25 Aug 2008 09:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in Klasse übergeben on Mon, 25 Aug 2008 10:04:26 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">foo&amp; operator=(foo rhs)
    {
        swap( rhs );
        return *this;
    }
</code></pre>
</blockquote>
<p>Warum machst du es auf die Art? Ist imho nicht so schnell als copy&amp;swap zu erkennen, wie auf die andere Art mit der Kopie im inneren.</p>
</blockquote>
<p>Ich dürfte aber einfach nur ein Gewöhnungseffekt sein. Es rührt eher prinzipiell an der Frage, ob Argument, die in jedem Falle kopiert werden müssen, nicht besser gleich per Value übergeben werden sollten. Die hier gezeigte Version hat einen handfesten Vorteil: die Kopie kann, falls das Argument selbst temporär ist, per RVO wegoptimiert werden (man bekommt also einen Fast-Move-Operator ohne etwas dafür zu zahlen), das ist nicht möglich, wenn die Kopie erst innerhalb der Funktion erfolgt. Beispiel</p>
<pre><code class="language-cpp">foo func();
foo x;
...
x = func();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1570919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570919</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 25 Aug 2008 10:04:26 GMT</pubDate></item></channel></rss>