<?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[Im Konstruktor Initialisierung von Objekt entscheiden]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ein kleines Minimalbeispiel:</p>
<p>In der Klasse <code>dummy</code> in Zeile 21 wird in Zeile 26 bzw. 27 ein Objekt <code>_d</code> initialisiert, dass entweder nach der Blaupause von <code>foo</code> oder <code>bar</code> entworfen wird. Dies kann ich durch auskommentieren steuern.</p>
<p>Jetzt aber die Frage: Kann ich das nicht auch über den Konstruktor entscheiden? Also ich initialisiere z.B. die Klasse <code>dummy</code> mittels <code>dummy d(bar)</code> und dadurch wird <code>_d</code> anhand von <code>bar</code> initialisiert?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class foo
{
	public:
		foo():_d(1.0){}
		double operator()(){ return _d; }
	private:
		double _d;
};

class bar
{
	public:
		bar():_d(2.0){}
		double operator()(){ return _d; }
	private:
		double _d;
};

class dummy
{
	public:
		double operator()(){ return _d(); }
	private:
		foo _d;
		//bar _d;
};

int main()
{
	dummy d;

	std::cout &lt;&lt; d() &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322769/im-konstruktor-initialisierung-von-objekt-entscheiden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 15:43:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322769.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jan 2014 10:14:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 10:14:08 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ein kleines Minimalbeispiel:</p>
<p>In der Klasse <code>dummy</code> in Zeile 21 wird in Zeile 26 bzw. 27 ein Objekt <code>_d</code> initialisiert, dass entweder nach der Blaupause von <code>foo</code> oder <code>bar</code> entworfen wird. Dies kann ich durch auskommentieren steuern.</p>
<p>Jetzt aber die Frage: Kann ich das nicht auch über den Konstruktor entscheiden? Also ich initialisiere z.B. die Klasse <code>dummy</code> mittels <code>dummy d(bar)</code> und dadurch wird <code>_d</code> anhand von <code>bar</code> initialisiert?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class foo
{
	public:
		foo():_d(1.0){}
		double operator()(){ return _d; }
	private:
		double _d;
};

class bar
{
	public:
		bar():_d(2.0){}
		double operator()(){ return _d; }
	private:
		double _d;
};

class dummy
{
	public:
		double operator()(){ return _d(); }
	private:
		foo _d;
		//bar _d;
};

int main()
{
	dummy d;

	std::cout &lt;&lt; d() &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375472</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Mon, 06 Jan 2014 10:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 10:28:06 GMT]]></title><description><![CDATA[<p>Ja, das geht. Aber nicht so, wie du es jetzt hast.<br />
Denn du kannst den Typen von _d nicht ohne weiters nach bar oder foo ändern.<br />
Dafür braucht man Vererbung und Polymorphie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375475</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 06 Jan 2014 10:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 10:52:07 GMT]]></title><description><![CDATA[<p>da foo und bar nicht polymorph sind, steht auch zu compilezeit fest, welchen typ das argument hat, mit welchem du den konstruktor aufrufst. folglich kann man schreiben:</p>
<pre><code>template&lt;typename T&gt;
class dummy
{
        T _d;
    public:
        explicit dummy(T const&amp; Rhs)
            : _d(Rhs)
        {
        }
        double operator()(){ return _d(); }
};
</code></pre>
<p>ich weiss, das ist etwas mühsam dass man immer den typen explizit angeben muss aber es hat dafür keinen laufzeit-overhead.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375483</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 06 Jan 2014 10:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 10:54:16 GMT]]></title><description><![CDATA[<p>Wollte gerade ein Template-Codebeispiel posten, gerade noch rechtzeitig gesehen, dass mir schon jemand die Arbeit abgenommen hat <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>In dem geposteten Beispiel sollte der Template-Parameter automatisch ermitelt werden können, eine explizite Angabe sollte nicht nötig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375484</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 06 Jan 2014 10:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 11:08:44 GMT]]></title><description><![CDATA[<p>Für mich klang das so, dass er das zur Runtime entscheidet haben möchte, bpsw. via einem bool Flag oder so.<br />
Naja, mal gucken, was er dazu sagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375488</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 06 Jan 2014 11:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 11:11:47 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>In dem geposteten Beispiel sollte der Template-Parameter automatisch ermitelt werden können, eine explizite Angabe sollte nicht nötig sein.</p>
</blockquote>
<p>ich bin mir jetzt nicht 100% sicher aber ich glaube, dass klassen-template-argumente nicht anhand des konstruktors deduziert werden (können). ansonsten könnte man <code>decltype</code> schon in c++03 implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375490</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 06 Jan 2014 11:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to Im Konstruktor Initialisierung von Objekt entscheiden on Mon, 06 Jan 2014 12:07:29 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>daddy_felix schrieb:</p>
<blockquote>
<p>In dem geposteten Beispiel sollte der Template-Parameter automatisch ermitelt werden können, eine explizite Angabe sollte nicht nötig sein.</p>
</blockquote>
<p>ich bin mir jetzt nicht 100% sicher aber ich glaube, dass klassen-template-argumente nicht anhand des konstruktors deduziert werden (können). ansonsten könnte man <code>decltype</code> schon in c++03 implementieren.</p>
</blockquote>
<p>Du kannst dir 100% sicher sein.<br />
Schließlich müssen die Parameter des Klassentemplates bekannt sein, um überhaupt erst ermitteln zu können, welche Konstruktoren die jeweilige Spezialisierung hat.</p>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Jetzt aber die Frage: Kann ich das nicht auch über den Konstruktor entscheiden? Also ich initialisiere z.B. die Klasse <code>dummy</code> mittels <code>dummy d(bar)</code> und dadurch wird <code>_d</code> anhand von <code>bar</code> initialisiert?</p>
</blockquote>
<p>Im Prinzip schon, falls du C++11 verwendest. Allerdings sollte das sehr gut überlegt sein, weil dann die Speicherverwaltung in der Klasse selbst implementiert werden muss.</p>
<p>ungefähr so:</p>
<pre><code class="language-cpp">class dummy
{
    public:
        dummy(foo x) : is_foo(true), foo_d{x} {}
        dummy(bar x) : is_foo(false), bar_d{x} {}
        dummy(const dummy&amp; other) : is_foo(other.is_foo)
        {
            is_foo ? (void*)new((void*)&amp;foo_d)foo(other.foo_d) : (void*)new((void*)&amp;bar_d)bar(other.bar_d);
        }
        dummy&amp; operator=(const bar&amp; rhs)
        {
...
        }
        ~dummy() { is_foo ? foo_d.~foo() : bar_d.~bar(); }
        double operator()(){ return is_foo ? bar_d() : foo_d(); }
    private:
        bool is_foo;
        union {
            foo foo_d;
            bar bar_d;
        };
};
</code></pre>
<p>wahrscheinlich falsch, sollte aber das Prinzip klarmachen. In 95% der Fälle dürfte es eine schlechte Idee sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375509</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 06 Jan 2014 12:07:29 GMT</pubDate></item></channel></rss>