<?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[Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Verständnisproblem bezüglich der korrekten Initialisierung von Arrays.<br />
Momentan sitze ich an einer Projektarbeit fürs Studium. Im Endeffekt sollen wir einen Compiler bauen, ohne dabei die std-lib zu verwenden. Da wir bei dem Projekt somit nur Basistypen verwenden dürfen, müssen wir Manche (z.B. vector) selbst implementieren.</p>
<p>Ich habe versucht die vector-Klasse grob zu implementieren, damit einfaches Listen-handling verfügbar ist und man nicht ständig seine Arrays manuell vergrößern muss.</p>
<p>Ich habe also meine Klasse Vector:</p>
<pre><code>template &lt;class T&gt;
class vector
{
public:
    vector();
    vector(int initialSize);

    ...

private:
    void resize();

    T buffer[];
    int index;
    int maxSize;

};
</code></pre>
<p>Mein Problem liegt hier im lokalen Puffer (buffer Variable). Wenn ich diese neu initialisiere (z.B. beim Vergrößern)</p>
<pre><code>buffer = new T[initialSize];
</code></pre>
<p>erhalte ich eine Fehlermeldung vom g++ compiler:</p>
<blockquote>
<p>no matching function for call to ‘Transition::Transition()’</p>
</blockquote>
<p>Dabei ist Transition die Klasse, auf die sich der Vektor bezieht (also jetzt nicht mehr generisch). Jedenfalls hat die Transition-Klasse keinen prameterlosen Konstruktor und dass ich hier diese Fehlermeldung erhalte, lässt mich darauf schließen, dass bei der Initialisierung von Arrays für jedes Element erst mal der Standardkonstruktor (damit meine ich den Parameterlosen) aufgerufen wird.<br />
Ist das soweit korrekt? Ich dachte nämlich bisher dass einfach nur der nötige Speicher reserviert wird und sonst nichts passiert.</p>
<p>Falls obige Vermutung richtig ist, würde es dann Sinn machen den Puffer zu einem Pointer-Array zu machen, damit nicht versucht wird den Konstruktor der Zielklasse aufzurufen?<br />
Also statt</p>
<pre><code>T buffer[];
</code></pre>
<p>dann</p>
<pre><code>T (*buffer)[];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/335222/wird-bei-der-arrayinitialisierung-der-konstruktor-des-arraytyps-aufgerufen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Apr 2026 18:18:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335222.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Nov 2015 16:27:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 16:27:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Verständnisproblem bezüglich der korrekten Initialisierung von Arrays.<br />
Momentan sitze ich an einer Projektarbeit fürs Studium. Im Endeffekt sollen wir einen Compiler bauen, ohne dabei die std-lib zu verwenden. Da wir bei dem Projekt somit nur Basistypen verwenden dürfen, müssen wir Manche (z.B. vector) selbst implementieren.</p>
<p>Ich habe versucht die vector-Klasse grob zu implementieren, damit einfaches Listen-handling verfügbar ist und man nicht ständig seine Arrays manuell vergrößern muss.</p>
<p>Ich habe also meine Klasse Vector:</p>
<pre><code>template &lt;class T&gt;
class vector
{
public:
    vector();
    vector(int initialSize);

    ...

private:
    void resize();

    T buffer[];
    int index;
    int maxSize;

};
</code></pre>
<p>Mein Problem liegt hier im lokalen Puffer (buffer Variable). Wenn ich diese neu initialisiere (z.B. beim Vergrößern)</p>
<pre><code>buffer = new T[initialSize];
</code></pre>
<p>erhalte ich eine Fehlermeldung vom g++ compiler:</p>
<blockquote>
<p>no matching function for call to ‘Transition::Transition()’</p>
</blockquote>
<p>Dabei ist Transition die Klasse, auf die sich der Vektor bezieht (also jetzt nicht mehr generisch). Jedenfalls hat die Transition-Klasse keinen prameterlosen Konstruktor und dass ich hier diese Fehlermeldung erhalte, lässt mich darauf schließen, dass bei der Initialisierung von Arrays für jedes Element erst mal der Standardkonstruktor (damit meine ich den Parameterlosen) aufgerufen wird.<br />
Ist das soweit korrekt? Ich dachte nämlich bisher dass einfach nur der nötige Speicher reserviert wird und sonst nichts passiert.</p>
<p>Falls obige Vermutung richtig ist, würde es dann Sinn machen den Puffer zu einem Pointer-Array zu machen, damit nicht versucht wird den Konstruktor der Zielklasse aufzurufen?<br />
Also statt</p>
<pre><code>T buffer[];
</code></pre>
<p>dann</p>
<pre><code>T (*buffer)[];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2474458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474458</guid><dc:creator><![CDATA[Code4Fun]]></dc:creator><pubDate>Fri, 06 Nov 2015 16:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 16:39:25 GMT]]></title><description><![CDATA[<p>Ja der Konstruktor wird immer aufgerufen. Bei einem std::vector kannst du auch kein resize machen wenn T keinen standard Konstruktor hat. Schau dir mal std::aligned_stotage und placement new an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474460</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 06 Nov 2015 16:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 17:10:40 GMT]]></title><description><![CDATA[<p>Statt deine Vectorklasse anders zu gestalten, als man es von Arrays oder std:vector gewohnt ist, kannst du ja auch statt</p>
<p>dein::vector&lt;Transition&gt;</p>
<p>dein::vector&lt;Transition*&gt;</p>
<p>nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474461</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Fri, 06 Nov 2015 17:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 17:29:29 GMT]]></title><description><![CDATA[<p>Oder <code>vector&lt;boost::optional&lt;T&gt;&gt;</code></p>
<p>sebi707 schrieb:</p>
<blockquote>
<p>Ja der Konstruktor wird immer aufgerufen. Bei einem std::vector kannst du auch kein resize machen wenn T keinen standard Konstruktor hat. Schau dir mal std::aligned_stotage und placement new an.</p>
</blockquote>
<p>Naja es gibt<br />
<code>void resize( size_type count);</code><br />
und<br />
<code>void resize( size_type count, const value_type&amp; value );</code></p>
<p>Der erste Overload geht freilich nicht ohne Default-Ctor.<br />
Für den zweiten reicht ein Copy-Ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474463</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 06 Nov 2015 17:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 18:18:03 GMT]]></title><description><![CDATA[<p>Deshalb holt sich der echte std::vector ja auch einen unitialisierten Speicherbereich via ::operator new (indirekt, durhc Alloc) und ruft erst bei Bedarf den CTor auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474467</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 06 Nov 2015 18:18:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 18:32:15 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Deshalb holt sich der echte std::vector ja auch einen unitialisierten Speicherbereich via ::operator new (indirekt, durhc Alloc) und ruft erst bei Bedarf den CTor auf.</p>
</blockquote>
<p>Wann sieht der echte Vector den Bedarf den CTor <strong>nicht</strong> aufzurufen?<br />
Im folgenden Code wird er 5x aufgerufen. Ich bin der Meinung das er immer aufgerufen wird, sobald Speicher neu-allokiert wird.</p>
<pre><code>class MyClass {
public:
  MyClass() {
    std::cout &lt;&lt; &quot;C'tor called&quot; &lt;&lt; std::endl;
  }

  ~MyClass() {
  }
};

int main() {
  std::vector&lt;MyClass&gt; v(5);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2474470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474470</guid><dc:creator><![CDATA[jb2603]]></dc:creator><pubDate>Fri, 06 Nov 2015 18:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 18:52:37 GMT]]></title><description><![CDATA[<p>jb2603 schrieb:</p>
<blockquote>
<p>Wann sieht der echte Vector den Bedarf den CTor <strong>nicht</strong> aufzurufen?</p>
</blockquote>
<p>Wenn man nur reserve'd und nicht resize'd.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474472</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 06 Nov 2015 18:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 22:39:14 GMT]]></title><description><![CDATA[<p>Vielen Dank Leute. Hat mir sehr geholfen.</p>
<p>Die Idee vector&lt;Transition*&gt; zu benutzen ist genial - da hätte ich mal selber drauf kommen können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> - danke dafür.</p>
<p>Kann mir vielleicht noch einer den Nutzen dahinter erklären, also warum der Ctor aufgerufen wird? Dient das nur dem Zweck den Speicher nicht undefiniert zu lassen falls man das Objekt abfragt bevor überhaupt eins erzeugt wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474479</guid><dc:creator><![CDATA[Code4Fun]]></dc:creator><pubDate>Fri, 06 Nov 2015 22:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Fri, 06 Nov 2015 23:55:57 GMT]]></title><description><![CDATA[<p>Code4Fun schrieb:</p>
<blockquote>
<p>Dient das nur dem Zweck den Speicher nicht undefiniert zu lassen falls man das Objekt abfragt bevor überhaupt eins erzeugt wurde?</p>
</blockquote>
<p>Du beschreibst das, als wäre das nur eine kleine Unannehmlichkeit, wenn das passieren würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474488</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 06 Nov 2015 23:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 00:28:37 GMT]]></title><description><![CDATA[<p>Code4Fun schrieb:</p>
<blockquote>
<p>Kann mir vielleicht noch einer den Nutzen dahinter erklären, also warum der Ctor aufgerufen wird? Dient das nur dem Zweck den Speicher nicht undefiniert zu lassen falls man das Objekt abfragt bevor überhaupt eins erzeugt wurde?</p>
</blockquote>
<p>Wenn kein Ctor aufgerufen wird dann gibt es das Objekt schlicht und ergreifend nicht. Ob der Speicher reserviert wurde spielt dabei keine Rolle -- ein Stückchen Speicher wird halt nicht einfach dadurch zu einem Objekt einer bestimmten Klasse indem man es sich wünscht. Oder einen Zeiger diesen Typs auf den Anfang dieses Speichers erzeugt.</p>
<p>Und wenn man auf ein Objekt zugreift das nicht existiert, dann ist das ein ganz grober Fehler.</p>
<p>Und das gilt auch wenn der erste Zugriff etwas wie z.B. der <code>operator =</code> ist.</p>
<p>Also...<br />
ANGENOMMEN dass <code>vector::resize</code> KEINEN Konstruktor aufrufen würde, dann wären BEIDE Verwendungen im Beispiel unten FALSCH:</p>
<pre><code class="language-cpp">void Foo()
{
    vector&lt;string&gt; v1;
    v1.resize(123);
    size_t s1 = v1[0].size(); // Fehler

    vector&lt;string&gt; v2;
    v2.resize(123);
    v2[0] = std::string(&quot;foo&quot;); // AUCH ein Fehler
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2474491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474491</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 07 Nov 2015 00:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 08:17:02 GMT]]></title><description><![CDATA[<p>Code4Fun schrieb:</p>
<blockquote>
<p>Ist das soweit korrekt? Ich dachte nämlich bisher dass einfach nur der nötige Speicher reserviert wird und sonst nichts passiert.</p>
</blockquote>
<p>Selber testen wäre höchst angebracht gewesen.<br />
<a href="https://ideone.com/vxAPu9" rel="nofollow">https://ideone.com/vxAPu9</a></p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

struct Tester{
	Tester(){
		cout&lt;&lt;&quot;hello, world!\n&quot;;
	}
};

int main(){
	Tester array[10];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2474495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474495</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 07 Nov 2015 08:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 09:45:01 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Ja der Konstruktor wird immer aufgerufen.</p>
</blockquote>
<p>Kann man jetzt so auch nicht sagen <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>
<pre><code>A* pa = (A*)::operator new(sizeof(A));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2474498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474498</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Sat, 07 Nov 2015 09:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 09:48:27 GMT]]></title><description><![CDATA[<p>Mr.Long schrieb:</p>
<blockquote>
<p>sebi707 schrieb:</p>
<blockquote>
<p>Ja der Konstruktor wird immer aufgerufen.</p>
</blockquote>
<p>Kann man jetzt so auch nicht sagen <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>
<pre><code>A* pa = (A*)::operator new(sizeof(A));
</code></pre>
</blockquote>
<p>Und was hast du hier, außer einem Zeiger auf rohen Speicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474499</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 07 Nov 2015 09:48:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 09:49:50 GMT]]></title><description><![CDATA[<pre><code>A* pa = cast&lt;A*&gt;(4711);
</code></pre>
<p>aber das Zeigern auf toten Speicher hat wenig mit der Frage zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474500</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 07 Nov 2015 09:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 12:14:04 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Mr.Long schrieb:</p>
<blockquote>
<pre><code>A* pa = (A*)::operator new(sizeof(A));
</code></pre>
</blockquote>
<p>Und was hast du hier, außer einem Zeiger auf rohen Speicher?</p>
</blockquote>
<p>Ich bin mir immer noch nicht sicher was der TO überhaupt möchte. Geht es um die Programmierung eines eigenen vector der nicht automatisch den Konstruktor aufruft oder geht es um die internen Strukturen des vectors? Also wenn der vector seinen Speicherbereich vergrößert und einige Elemente am Ende noch nicht belegt sind? Im letzteren Fall wäre Speicher mit <code>::operator new</code> reservieren und dann nur die benötigten Objekte mit placement new erzeugen, das was man meiner Meinung nach tun sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474506</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sat, 07 Nov 2015 12:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wird bei der Arrayinitialisierung der Konstruktor des Arraytyps aufgerufen? on Sat, 07 Nov 2015 14:06:02 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Mr.Long schrieb:</p>
<blockquote>
<p>sebi707 schrieb:</p>
<blockquote>
<p>Ja der Konstruktor wird immer aufgerufen.</p>
</blockquote>
<p>Kann man jetzt so auch nicht sagen <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>
<pre><code>A* pa = (A*)::operator new(sizeof(A));
</code></pre>
</blockquote>
<p>Und was hast du hier, außer einem Zeiger auf rohen Speicher?</p>
</blockquote>
<p>Hängt von der Implementierung des operators new ab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474517</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Sat, 07 Nov 2015 14:06:02 GMT</pubDate></item></channel></rss>