<?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[problem mit new-array und klasse]]></title><description><![CDATA[<p>guten abend</p>
<p>ich habe ein problem, dass wenn ich eine klasse definiere</p>
<pre><code>class demo{
private: const int zahl;
public: demo(const int newZahl):zahl(newzahl) {}
};
</code></pre>
<p>und dann versuche, ein array mit new zu bilden</p>
<pre><code>demo *p;
p= new demo [5];
</code></pre>
<p>.<br />
der compiler beklagt sich, dass ihm ein passender konstruktor fehlt, nur kann ich keinen anderen bilden, denn dieser schreibt mir andere, falsche werte für zahl rein (zb</p>
<pre><code>demo():zahl(0) {}
</code></pre>
<p>)<br />
und afaik ist das &quot;demo&quot; in &quot;new demo [5]&quot; nur dazu da, um anzuzeigen vie groß die klasse ist</p>
<p>jedenfalls muss ich dannach in einer schleife noch auf die elemente des arrays zugreifen können:</p>
<pre><code>for(int i=0; i&lt;=5; i++)
{
p[i]=new demo((const int)i);
}
</code></pre>
<p>das geht nichtmehr, wenn ich enen konstruktor erzeuge, wie im text oben beschrieben.<br />
hat jemand eine lösung?</p>
<p>vielen dank euch allen</p>
<p>mfg<br />
hann</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228537/problem-mit-new-array-und-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 14:07:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228537.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Nov 2008 16:53:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit new-array und klasse on Sat, 29 Nov 2008 16:53:36 GMT]]></title><description><![CDATA[<p>guten abend</p>
<p>ich habe ein problem, dass wenn ich eine klasse definiere</p>
<pre><code>class demo{
private: const int zahl;
public: demo(const int newZahl):zahl(newzahl) {}
};
</code></pre>
<p>und dann versuche, ein array mit new zu bilden</p>
<pre><code>demo *p;
p= new demo [5];
</code></pre>
<p>.<br />
der compiler beklagt sich, dass ihm ein passender konstruktor fehlt, nur kann ich keinen anderen bilden, denn dieser schreibt mir andere, falsche werte für zahl rein (zb</p>
<pre><code>demo():zahl(0) {}
</code></pre>
<p>)<br />
und afaik ist das &quot;demo&quot; in &quot;new demo [5]&quot; nur dazu da, um anzuzeigen vie groß die klasse ist</p>
<p>jedenfalls muss ich dannach in einer schleife noch auf die elemente des arrays zugreifen können:</p>
<pre><code>for(int i=0; i&lt;=5; i++)
{
p[i]=new demo((const int)i);
}
</code></pre>
<p>das geht nichtmehr, wenn ich enen konstruktor erzeuge, wie im text oben beschrieben.<br />
hat jemand eine lösung?</p>
<p>vielen dank euch allen</p>
<p>mfg<br />
hann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622974</guid><dc:creator><![CDATA[hann]]></dc:creator><pubDate>Sat, 29 Nov 2008 16:53:36 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit new-array und klasse on Sat, 29 Nov 2008 19:08:27 GMT]]></title><description><![CDATA[<p>wenn du nicht auf ekelhafte sachen wie placement-new zurückgreifen willst (und du willst nicht), dann verwende std::vector.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

//...
vector&lt;demo&gt; v(10, demo(42));
</code></pre>
<p>zugriff wie gewohnt über den indexoperator.</p>
<p>hann schrieb:</p>
<blockquote>
<p>und afaik ist das &quot;demo&quot; in &quot;new demo [5]&quot; nur dazu da, um anzuzeigen vie groß die klasse ist</p>
</blockquote>
<p>das verstehe ich nicht.</p>
<blockquote>
<p>jedenfalls muss ich dannach in einer schleife noch auf die elemente des arrays zugreifen können:</p>
<pre><code>for(int i=0; i&lt;=5; i++)
{
p[i]=new demo((const int)i);
}
</code></pre>
<p>das geht nichtmehr, wenn ich enen konstruktor erzeuge, wie im text oben beschrieben.<br />
hat jemand eine lösung?</p>
</blockquote>
<p>das geht nicht nur &quot;nichtmehr&quot;, das ging nie. btw. ein const_cast ist hier nicht nötig und das argument im konstruktor muss auch kein const int sein, int reicht. (im der elementvariable in der klasse wird einfach eine kopie davon angelegt)</p>
<p>aber ich weiß hier auch nicht genau, was du bezwecken willst. wenn du schon objekte angelegt hast, warum willst du dann nochmal ein neues anlegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623025</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 29 Nov 2008 19:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit new-array und klasse on Sat, 29 Nov 2008 19:09:21 GMT]]></title><description><![CDATA[<p>Für</p>
<pre><code class="language-cpp">p= new demo [5];
</code></pre>
<p>brauchst du einen Standardkonstruktor. Zusätzlich kommt bei dir das Problem hinzu, dass const-Member in der Memberinitialisierungsliste initialisiert werden müssen.</p>
<p>Das Problem kann man auf vielen Wegen umgehen. Ohne Standardkonstruktor musst du eben alles selbst machen. Zum Beispiel so:</p>
<pre><code class="language-cpp">demo *p;

p = (demo*) new char[sizeof(demo) * 5]; //Speicher reservieren

for (int i=0; i  &lt; 5; ++i)
    new (p + i) demo(i);                //Für jedes Objekt den Konstruktor aufrufen

// Array verwenden

for (int i=0; i&lt; 5; ++i)
    p[i].demo::~demo();                 //Für jedes Objekt den Destruktor aufrufen

delete[] (char*) p;                     //Speicher freigeben
</code></pre>
<p>Du kannst natürlich auch alles in statischen Methoden der Klasse verstecken.</p>
<p>Alternativ kannst du STL-Container (Vektor, ...) verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623028</guid><dc:creator><![CDATA[Zweifler]]></dc:creator><pubDate>Sat, 29 Nov 2008 19:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit new-array und klasse on Sun, 30 Nov 2008 10:25:12 GMT]]></title><description><![CDATA[<p>Hallo hann,</p>
<p>zunächst stimme ich <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14600">@queer_boy</a> mit der Verwendung der Klasse Vector aus der Standard-Bibliothek zu. Die erspart dir viel Ärger um das Speichermanagement.</p>
<p>Was @Zweifler da bezüglich der Speicheranforderung über den Umweg mit dem Typ 'char' geschrieben hat sehe ich als unsauber an.<br />
Für seine C-Casts gibt es als C++-Entsprechung den reinterpret_cast&lt; ... &gt;.</p>
<p>Zunächst aber zu Deinem Code:</p>
<pre><code>p= new demo [5];
</code></pre>
<p>Diese Verwendung des new-Operators reserviert Platz für 5 Objekte des Typs 'demo' und initialisiert alle 5 Objekte mit dem Standardkonstruktor. Da dieser in Deiner Klasse nicht vorhanden ist, beschwert sich der Compiler.</p>
<p>Bei der von Dir verwendeten Version des 'operator new' zur Konstruktion der Objekte innerhalb der Schleife mit</p>
<pre><code>p[i]=new demo((const int)i);
</code></pre>
<p>legst Du keine Objekte im bereits reservierten Speicher an, sondern forderst für jedes Objekt wieder neuen Speicher an, in welchem dann das Objekt konstruiert wird - auch nicht das, was Du möchtest.</p>
<p>Für die Reservierung von uninitialisiertem Rohspeicher mußt du die folgende Version des 'operators new' verwenden:</p>
<pre><code>p = static_cast&lt;demo*&gt;(operator new[] (sizeof(demo)*6));
</code></pre>
<p>Dieser Operator muß explizit aufgerufen werden und erhält die Größe des zu reservierenden Bereiches in Byte. Der Rückgabewert dieses operator new ist immer vom Typ 'void*', weshalb hier der C++-Cast nach 'demo*' eingesetzt wurde.</p>
<p>Die eigentliche Konstruktion der Objekte in dem bereits angeforderten Speicher erfolgt dann mit dem 'placement new', welchem im ersten Parameter die Speicheradresse und im zweiten der Konstruktor für die Objekt-Konstruktion übergeben wird. Das sieht dann so aus, wie @Zweifler es zeigt oder unter Verwendung des Index-Operators:</p>
<pre><code>new (&amp;p[i]) demo(i);
</code></pre>
<p>Der zum oben gezeigten 'operator new' passende 'operator delete' sieht folgendermaßen aus:</p>
<pre><code>operator delete[] (p);
</code></pre>
<p>Bei dieser Art der Programmierung kommt es jedoch sehr schnell zu fehlerhaftem Speicherzugriff. Bei Deinem geposteten Entwurf zum Beispiel reservierst Du Platz für 5 Objekte, beschreibst später in der Schleife jedoch 6 Objekte, überschreitest also den dir bereitgestellten Speicherplatz.<br />
Von daher kann ich nur die Empfehlung der Nutzung der Vector-Klasse aus der Standard-Bibliothek wiederholen.</p>
<p>Edit: Für die Art und Weise, wie ich auf @Zweiflers post in der Erstfassung dieses Beitrags reagiert habe, möchte ich mich entschuldigen. In der jetzigen Version habe ich die entsprechenden Stellen geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623075</guid><dc:creator><![CDATA[mario_69]]></dc:creator><pubDate>Sun, 30 Nov 2008 10:25:12 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit new-array und klasse on Sat, 29 Nov 2008 23:49:31 GMT]]></title><description><![CDATA[<p>mario_69 schrieb:</p>
<blockquote>
<p>Was @Zweifler da geschrieben hat, vergiß ganz schnell. Der Umweg über 'char' bei dem Speichermanagement ist ein böser C-Hack, und für den C-Cast gibt es auch eine saubere Entsprechung in C++.</p>
</blockquote>
<p>Das ist zwar kein C-Hack und schon gar kein böser, aber ich gebe dir natürlich Recht, dass man mit den <strong>opretor new</strong> und <strong>operator delete</strong>-Funktionen günstiger Möglichkeiten hat Roh-Speicher zu verarbeiten.</p>
<p>Über das static_cast kann man sich streiten. Ich finde es sieht an der Stelle einfach nur scheiße aus und macht den Quelltext unleserlich.</p>
<p>mario_69 schrieb:</p>
<blockquote>
<p>Zu beachten ist hier das Konstrukt '&amp;p[i]'. Obwohl p ein Zeiger auf ein Objekt vom Typ 'demo' ist, ist p[i] direkt ein Objekt vom Typ 'demo'! Deswegen der Adressoperator '&amp;'</p>
</blockquote>
<p>Das &quot;Konstrukt&quot; ist ja richtig süß. Es steht halt schlicht &amp;(*(p+i)) da. Also doppeltgemoppelter Käse.</p>
<p>Ansonste Danke, dass du dir die Mühe gemacht hast dasselbe nochmal in Grün hinzuschreiben. <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/1623123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623123</guid><dc:creator><![CDATA[Zweifler]]></dc:creator><pubDate>Sat, 29 Nov 2008 23:49:31 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit new-array und klasse on Sun, 30 Nov 2008 00:18:52 GMT]]></title><description><![CDATA[<p>Der static_cast hat nichts mit schön oder unschön zu tun. Vielmehr drücke ich damit aus, daß ich eine Konvertierung zwischen verwandten Typen durchführe. Und dies wird in diesem Fall durch den Compiler während der Übersetzung geprüft.</p>
<p>Der einfache C-Cast ist in jedem Fall schwerer im Quellcode zu finden, und er konvertiert nicht nur zwischen verwandten Typen sondern auch zwischen konstanten und nicht konstanten Typen sowie zwischen völlig unterschiedlichen Typen. Ich bin der Meinung, daß der Programmierer seine Absichten möglichst deutlich machen soll, und die 4 C++-Casts beschreiben sehr genau die Absichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623136</guid><dc:creator><![CDATA[mario_69]]></dc:creator><pubDate>Sun, 30 Nov 2008 00:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit new-array und klasse on Sun, 30 Nov 2008 00:25:05 GMT]]></title><description><![CDATA[<p>Klar, aber bei einem void* ist das in meinen Augen nur Ballast. Und die relevante Information steht auch andersherum bereits da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623138</guid><dc:creator><![CDATA[Zweifler]]></dc:creator><pubDate>Sun, 30 Nov 2008 00:25:05 GMT</pubDate></item></channel></rss>