<?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[Initialisieren von einer Klasseninstanz]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe ein Problem beim Initialisieren von einer Klasseninstanz. Über eine Variable soll geprüft werden ob die Instanz mit Konstruktor1 oder Konstruktor2 initialisert werden soll.<br />
Wenn ich aber Folgedes aufrufe:</p>
<pre><code class="language-cpp">if (temp)	Klasse Instanzname(Konstruktor1);
else 		Klasse Instanzname(Konstruktor2);

Instanzname.methode();  //&lt;- hier kennt er den Bezeichner nicht
</code></pre>
<p>bekomme ich die Fehlermeldung: nichtdeklarierter Bezeichner.<br />
Das liegt ja daran, das die Klasse in einer If-Schleife initialisiert wird und er deshalb wohl davon ausgeht, dass die Instanz eventuell nicht exestiert.<br />
Ich habe es mit dem ? Operator probiert aber hatte lieder auch keinen Erfolg.<br />
Kann mir bitte jemand sagen, wie ich das ganze umstellen muss, dass es funktioniert?</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304951/initialisieren-von-einer-klasseninstanz</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 06:01:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304951.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Jun 2012 20:01:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 20:11:47 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe ein Problem beim Initialisieren von einer Klasseninstanz. Über eine Variable soll geprüft werden ob die Instanz mit Konstruktor1 oder Konstruktor2 initialisert werden soll.<br />
Wenn ich aber Folgedes aufrufe:</p>
<pre><code class="language-cpp">if (temp)	Klasse Instanzname(Konstruktor1);
else 		Klasse Instanzname(Konstruktor2);

Instanzname.methode();  //&lt;- hier kennt er den Bezeichner nicht
</code></pre>
<p>bekomme ich die Fehlermeldung: nichtdeklarierter Bezeichner.<br />
Das liegt ja daran, das die Klasse in einer If-Schleife initialisiert wird und er deshalb wohl davon ausgeht, dass die Instanz eventuell nicht exestiert.<br />
Ich habe es mit dem ? Operator probiert aber hatte lieder auch keinen Erfolg.<br />
Kann mir bitte jemand sagen, wie ich das ganze umstellen muss, dass es funktioniert?</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224316</guid><dc:creator><![CDATA[Sherlock]]></dc:creator><pubDate>Sun, 17 Jun 2012 20:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 20:53:58 GMT]]></title><description><![CDATA[<p>Wenn man es so schreibt, siehst du es vielleicht direkt.</p>
<pre><code class="language-cpp">if (temp)
{
    Klasse Instanzname(Konstruktor1);
}
else
{
    Klasse Instanzname(Konstruktor2);
}
Instanzname.methode(); // Instanzname ist hier schon längst out of scope gelaufen.
</code></pre>
<p>Falls deine Klasse default constructible ist und nen Zuweisungsoperator hat:</p>
<pre><code class="language-cpp">Klasse Instanzname;
if (temp) Instanzname = Klasse(Konstruktor1);
else Instanzname = Klasse(Konstruktor2);
Instanzname.methode();
</code></pre>
<p>Wenn das nicht geht, wirst du um so etwas in der Art hier wohl nicht drumherum kommen:</p>
<pre><code class="language-cpp">typedef std::unique_ptr&lt;Klasse&gt; KlassenPtr;
KlassenPtr p;
if (temp) p = KlassenPtr(new Klasse(Konstruktor1));
else n = KlassenPtr(new Klasse(Konstruktor2)),
KlassenPtr-&gt;methode();
</code></pre>
<p>Ich gehe mal davon aus, dass Konstruktor1 und Konstruktor2 bei dir Variablen mit verschiedenen Datentypen sind. Dann solltest du sie aber auch hier im Minimalbeispiel nicht KonstruktorN nennen, weil sie ja keine ctors sind sondern Parameter für eben jene, die den Compiler dazu bringen jeweils die passende Überladung zu benutzen.</p>
<p>Achja, und natürlich: <a href="http://www.if-schleife.de/" rel="nofollow">http://www.if-schleife.de/</a> <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>
<p>Edit: Wenn Konstruktor1 und Konstruktor2 vom gleichen Typ sind und nur unterschiedliche Werte halten (wie die ints im Beispiel von KN4CK3R), kannst du auch sowas machen:</p>
<pre><code class="language-cpp">Klasse Instanzname(temp ? Konstruktor1 : Konstruktor2);
Instanzname.methode();
</code></pre>
<p>Um zu wissen, um was es sich da bei dir handelt, wäre ein *kompilierbares* Minimalbeispiel halt toll gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224331</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sun, 17 Jun 2012 20:53:58 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 20:39:21 GMT]]></title><description><![CDATA[<p>Instanzname ist nur im Scope des if Blocks gültig.<br />
Du könntest es mit Zeigern lösen</p>
<pre><code class="language-cpp">Klasse *instanzname;
if (temp)
   instanzname = new Klasse(1);
else
   instanzname = new Klasse(2);
instanzname-&gt;methode();

delete instanzname;
</code></pre>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224332</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Sun, 17 Jun 2012 20:39:21 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 20:45:41 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>die Instanz von Klasse besteht auf diese Art nur bis zum verlassen des If-Rumpfs. Mit <strong>new</strong> initalisierte Objekte wären auch nach dem Rumpf noch gültig, der Zugriff könnte über Pointer oder Referenzen erfolgen - welche schon vor dem If-Block oder Rumpf bestehen.</p>
<p>Bedenke aber auch die Aufräumarbeiten oder verwende intelligente Zeiger.</p>
<p>Gruss</p>
<p>Edit:<br />
Tja und ein paar Sekunden zuvor der passende Code zur Erklärung:</p>
<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Instanzname ist nur im Scope des if Blocks gültig.<br />
Du könntest es mit Zeigern lösen</p>
<pre><code class="language-cpp">Klasse *instanzname;
if (temp)
   instanzname = new Klasse(1);
else
   instanzname = new Klasse(2);
instanzname-&gt;methode();

delete instanzname;
</code></pre>
<p>greetz KN4CK3R</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2224333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224333</guid><dc:creator><![CDATA[tommy_tom_tom]]></dc:creator><pubDate>Sun, 17 Jun 2012 20:45:41 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 20:54:49 GMT]]></title><description><![CDATA[<p>Vielen Dank für die schnellen Hilfen! Werde das Ganze gleich mal testen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2224341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224341</guid><dc:creator><![CDATA[Sherlock]]></dc:creator><pubDate>Sun, 17 Jun 2012 20:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 21:01:07 GMT]]></title><description><![CDATA[<p>Läuft alles. Vielen Dank Problem gelöst <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2224344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224344</guid><dc:creator><![CDATA[Sherlock]]></dc:creator><pubDate>Sun, 17 Jun 2012 21:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 21:45:02 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Du könntest es mit Zeigern lösen</p>
<pre><code class="language-cpp">Klasse *instanzname;
if (temp)
   instanzname = new Klasse(1);
else
   instanzname = new Klasse(2);
instanzname-&gt;methode();

delete instanzname;
</code></pre>
</blockquote>
<p>Nö, das ist Mist ohne <code>unique_ptr</code> .</p>
<p>So ein Hack mit <code>new</code> als Lösung deutet übrigens darauf hin, dass das Problem mit besserem Design vermeidbar wäre. In welchem Zusammenhang musst du denn zwischen zwei Konstruktoren wählen? Wie sehen die aus und was ist die Bedingung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224358</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sun, 17 Jun 2012 21:45:02 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Sun, 17 Jun 2012 22:41:53 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Klasse Instanzname = temp ? Klasse(Konstruktor1) : Klasse(Konstruktor2);
...
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">auto undsoweiter = [&amp;](Klasse&amp; Instanzname){
  ...
};
if (temp) {
  Klasse Instanzname (Konstruktor1);
  undsoweiter(Instanzname);
} else {
  Klasse Instanzname (Konstruktor2);
  undsoweiter(Instanzname);
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">boost::optional&lt;Klasse&gt; dingen;
if (temp) {
  dingen = Klasse(Konstruktor1);
} else {
  dingen = Klasse(Konstruktor2);
}
Klasse&amp; Instanz = *dingen;
...
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::unique_ptr&lt;Klasse&gt; dingen;
if (temp) {
  dingen.reset(new Klasse(Konstruktor1));
} else {
  dingen.reset(new Klasse(Konstruktor2));
}
Klasse&amp; Instanz = *dingen;
...
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::vector&lt;Klasse&gt; dingen;
if (temp) {
  dingen.emplace_back(Konstruktor1);
} else {
  dingen.emplace_back(Konstruktor2);
}
Klasse&amp; Instanz = dingen[0];
...
</code></pre>
<p>...</p>
<p>Mehr Kontext bei der Frage wär jetzt praktisch gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224382</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 17 Jun 2012 22:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisieren von einer Klasseninstanz on Mon, 18 Jun 2012 08:50:32 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Klasse Instanzname = temp ? Klasse(Konstruktor1) : Klasse(Konstruktor2);
</code></pre>
</blockquote>
<p>Oh, stimmt. So ist's sehr hübsch. <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 />
Jetzt hat mich dabei interessiert, ob das dann auch ohne Aufruf vom copy-ctor auskommt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
struct Foo
{
    Foo(int) { std::cout &lt;&lt; &quot;Foo(int)&quot; &lt;&lt; std::endl; }
    Foo(int, int) { std::cout &lt;&lt; &quot;Foo(int, int)&quot; &lt;&lt; std::endl; }
    Foo(const Foo&amp;) { std::cout &lt;&lt; &quot;Foo(const Foo&amp;)&quot; &lt;&lt; std::endl; }
    Foo&amp; operator=(const Foo&amp;) { std::cout &lt;&lt; &quot;operator=(const Foo&amp;)&quot; &lt;&lt; std::endl; return *this;}
};
int main() {
    int input;
    std::cin &gt;&gt; input;
    Foo fa(1);
    std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;
    Foo fb = Foo(1);
    std::cout &lt;&lt; &quot;---&quot; &lt;&lt; std::endl;
    Foo fc = input == 1 ? Foo(1) : Foo(1, 2);
}
</code></pre>
<p>Beim GCC tut es das:</p>
<pre><code>1
Foo(int)
---
Foo(int)
---
Foo(int)
</code></pre>
<p>Interessanterweise macht MSVC 2010 Express (Release) das anders:</p>
<pre><code>1
Foo(int)
---
Foo(int)
---
Foo(int)
Foo(const Foo&amp;)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2224448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224448</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Mon, 18 Jun 2012 08:50:32 GMT</pubDate></item></channel></rss>