<?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[Gültigkeitsbereich im Konstruktor]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn ich eine Variable im Konstruktor der Klasse definiere.<br />
Ist sie dann bis zum Aufruf des Desktruktors gültig oder nur bis zum Ende des Konstruktors?</p>
<pre><code>class test
{
test::test()
{
int var1 = 0;
}
};
</code></pre>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264987/gültigkeitsbereich-im-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 02:41:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264987.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Apr 2010 23:41:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Thu, 15 Apr 2010 23:41:33 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn ich eine Variable im Konstruktor der Klasse definiere.<br />
Ist sie dann bis zum Aufruf des Desktruktors gültig oder nur bis zum Ende des Konstruktors?</p>
<pre><code>class test
{
test::test()
{
int var1 = 0;
}
};
</code></pre>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1883630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883630</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Thu, 15 Apr 2010 23:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Fri, 16 Apr 2010 00:23:22 GMT]]></title><description><![CDATA[<p>nur innerhalb des konstruktors.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1883634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883634</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Fri, 16 Apr 2010 00:23:22 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Fri, 16 Apr 2010 05:58:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie kann ich das ändern? Etwa so?</p>
<pre><code>class test
{
private:
int *_var;

public:
test::test()
{
_var = new int;
}
};
</code></pre>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1883647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883647</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Fri, 16 Apr 2010 05:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Fri, 16 Apr 2010 06:23:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class test 
{
private:
    int var1;

public:
    test() : var1(0)
    { 
    } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1883654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883654</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 16 Apr 2010 06:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Fri, 16 Apr 2010 06:45:39 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich muss mein Problem präziser beschreiben:<br />
Mein Problem ist das ich nicht alle Member der Klasse als class test speichern kann. Bei einigen kann ich nur class *test speichern. Wobei einige Werte für *test erst im Konstruktor erzeugt werden und dann bis zum Destruktor ihre Gültigkeit behalten sollen. Wie mach ich das richtig?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1883664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883664</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Fri, 16 Apr 2010 06:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Fri, 16 Apr 2010 07:12:06 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p>...<br />
Mein Problem ist das ich nicht alle Member der Klasse als class test speichern kann. ...</p>
</blockquote>
<p>Hier wäre es gut, wenn Du kurz auf die Gründe eingehen könntest.<br />
Natürlich ist &quot;manuelle Objekterzeugung&quot; bisweilen vonnöten - aber auch nicht immer. Der Umstand, dass die Initialwerte erst zur Laufzeit feststehen ist z.B. kein Grund (-&gt; Initialisierungsliste) ... falls der <em>Typ</em> erst zur Laufzeit feststeht schon eher.<br />
<em>Wenn</em> Du es tatsächlich brauchst, ist aber new der richtige Weg. Dann musst Du aber Einiges bedenken (z.B. verschiedene Situationen, in denen das Objekt kopiert wird) und entsprechend implementieren. smart-Pointer können Dir da weiterhelfen...<br />
Deshalb würde ich immer solange wie irgend möglich versuchen, darauf zu verzichten.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1883672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883672</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 16 Apr 2010 07:12:06 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Fri, 16 Apr 2010 07:42:38 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p>ich muss mein Problem präziser beschreiben:</p>
</blockquote>
<p>Also ich verstehe nach dieser &quot;präzisen&quot; Beschreibung nur noch Bahnhof (Da sind einige automatisch übersetzte Texte verständlicher).</p>
<p>Grundsätzlich gilt aber: Variablen die nicht nur innerhalb einer Methode, sondern über die Lebenszeit eines Objektes benötigt werden, sollten Membervariablen sein, oder jedesmal per Parameterübergabe mitgeliefert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1883680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1883680</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 16 Apr 2010 07:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 10:41:55 GMT]]></title><description><![CDATA[<p>Sorry Leute,</p>
<p>hier mal mein Code:</p>
<pre><code>class IGUIElement
{
public:
IGUIElement(parent *p);
~IGUIElement();

private:
long var1;
long var2;
};

class test
{
public:
test();
~test();

private:
IGUIElement *_mainframe;
};
</code></pre>
<pre><code>test::test()
{
_mainframe = new IGUIElement(this);
}
</code></pre>
<p>Also wenn ich nicht * vor mainframe verwende meckert der Compiler über einen fehlenden Konstruktor.<br />
Wie mach ich das, dass _mainframe bis ~test() gültig bleibt?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884192</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Sat, 17 Apr 2010 10:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 10:48:19 GMT]]></title><description><![CDATA[<p>Bin mir nicht sicher ob ich das Problem verstehe, aber ich glaube die Lösung heißt Initialisierungsliste.</p>
<pre><code>class test
{
public:
test();
~test();

private:
IGUIElement _mainframe;
};
</code></pre>
<pre><code>test::test() : _mainframe(this)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1884197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884197</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sat, 17 Apr 2010 10:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 10:49:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class test
{
public:
test();
~test();

private:
IGUIElement _mainframe;
};

// ...

test::test() : _mainframe(this)
{
}
</code></pre>
<p>Wobei ich jetzt mir aber grade nicht sicher bin, ob man this schon in der Initialisierungsliste verwenden darf (das Objekt ist ja noch gar nicht vollständig initialisiert). Ansonsten funktioniert die Variante von dir, per new angeforderter Speicher bleibt, bis er per delete freigegeben wird, und wenn das erst in ~test geschieht, lebt das Objekt eben auch so lange.</p>
<p>EDIT: zu spät...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884199</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 17 Apr 2010 10:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 11:05:59 GMT]]></title><description><![CDATA[<p>Also kann ich eigentlich nichts verkehr machen wenn ich new und delete verwende?</p>
<p>Wenn ich bei ~test() vergesse delete aufzurufen, hab ich ein Speicherleck oder?</p>
<p>wenn ich delete IGUIELement aufrufe wird dann auch der Destruktor von IGUIElement aufgerufen?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884203</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Sat, 17 Apr 2010 11:05:59 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 11:22:53 GMT]]></title><description><![CDATA[<p>Nein, ja, ja.</p>
<p>Verkehrt machen kannst du folgendes:</p>
<pre><code class="language-cpp">class test
{
public:
test() { _mainframe = new IGUIElement(...); }
~test() { delete _mainframe; }

private:
IGUIElement *_mainframe;
};

// ...

int main() 
{
    test a, b;
    a = b;
}
</code></pre>
<p>Und schon hast du einen Crash. Warum? Weil bei der Zuweisung a = b der Zeiger _mainframe einfach stumpf kopiert wird. Am Ende der Funktion werden a und b zerstört, beide Destruktoren werden aufgerufen und auf den gleichen Zeiger wird 2 mal delete ausgeführt -&gt; das geht schief. Um das zu verhindern musst du auch noch einen Zuweisungsoperator und einen Kopierkonstruktor definieren, die eine tiefe Kopie erzeugen. Google dazu auch mal nach der Regel der Großen Drei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884211</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 17 Apr 2010 11:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 11:51:38 GMT]]></title><description><![CDATA[<p>Cool danke an alle für die Hilfe jetzt weiß ich was ich wissen wollte.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884221</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Sat, 17 Apr 2010 11:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 17 Apr 2010 23:23:49 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Wobei ich jetzt mir aber grade nicht sicher bin, ob man this schon in der Initialisierungsliste verwenden darf (das Objekt ist ja noch gar nicht vollständig initialisiert).</p>
</blockquote>
<p>Verwenden darf man es, man sollte nur Funktionsaufrufe etc. unterlassen, die auf diesen Speicher zugreifen (Der Zeiger an sich ist gültig, der Bereich dahinter aber noch nicht vollständig initialisiert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884430</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 17 Apr 2010 23:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Mon, 19 Apr 2010 06:52:53 GMT]]></title><description><![CDATA[<p>Nur noch 2 kleine Ergänzungen, um das Bild abzurunden.</p>
<p>ipsec schrieb:</p>
<blockquote>
<p>Nein, ja, ja.</p>
<p>Verkehrt machen kannst du folgendes:</p>
<pre><code class="language-cpp">class test
{
public:
test() { _mainframe = new IGUIElement(...); }
~test() { delete _mainframe; }

private:
IGUIElement *_mainframe;
};

// ...

int main() 
{
    test a, b;
    a = b;
}
</code></pre>
<p>....auf den gleichen Zeiger wird 2 mal delete ausgeführt -&gt; das geht schief. ...</p>
</blockquote>
<p>+ er hat ein Speicherleck (das erste a::_mainframe wird nicht abgeräumt).</p>
<p>ipsec schrieb:</p>
<blockquote>
<p>...Um das zu verhindern musst du auch noch einen Zuweisungsoperator und einen Kopierkonstruktor definieren, die eine tiefe Kopie erzeugen. ...</p>
</blockquote>
<p>...oder die eine Kopie verhindern.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884904</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 19 Apr 2010 06:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Mon, 19 Apr 2010 06:58:43 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p>Also kann ich eigentlich nichts verkehr machen wenn ich new und delete verwende?</p>
</blockquote>
<p>Wie schon dargelegt wurde kannst du vieles verkehrt machen. Wie du deinen Mainframe als &quot;richtiges&quot; Member (also nicht als Pointer) verwenden kannst wurde ja schon gezeigt. Das ist deutlich sicherer und du kannst vieles <em>nicht</em> verkehrt machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884908</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 19 Apr 2010 06:58:43 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Mon, 19 Apr 2010 08:36:33 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>Bin mir nicht sicher ob ich das Problem verstehe, aber ich glaube die Lösung heißt Initialisierungsliste.</p>
<pre><code>class test
{
public:
test();
~test();

private:
IGUIElement _mainframe;
};
</code></pre>
<pre><code>test::test() : _mainframe(this)
{
}
</code></pre>
</blockquote>
<p><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="😞"
    /> Das funktioniert leider nicht weil:<br />
error C2259: 'IGUIElement': Instanz von abstrakter Klasse kann nicht erstellt werden</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884951</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 19 Apr 2010 08:36:33 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Mon, 19 Apr 2010 09:22:11 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p><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="😞"
    /> Das funktioniert leider nicht weil:<br />
error C2259: 'IGUIElement': Instanz von abstrakter Klasse kann nicht erstellt werden</p>
</blockquote>
<p>Das hat dann nichts mit der Entscheidnung pointer vs normaler Member zu tun, sondern damit, dass IGUIElement oder eine seiner Basisklassen eine pur virtuelle Methode enthält und nicht instantiiert werden kann (bzw. nur als Basisklassenobjekt einer Klasse, die die entsprechenden Methoden überschreibt). Die Fehlermeldung wäre dir auch bei der Variante &quot;Pointer + new/delete&quot; gekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884966</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 19 Apr 2010 09:22:11 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich im Konstruktor on Sat, 24 Apr 2010 15:01:53 GMT]]></title><description><![CDATA[<p>Alles klar danke an euch alle.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887690</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Sat, 24 Apr 2010 15:01:53 GMT</pubDate></item></channel></rss>