<?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[falscher ctor Aufruf... wie verhindern?]]></title><description><![CDATA[<pre><code class="language-cpp">enum TestEnum { e1, e2 };

class Klasse {
   explicit Klasse( TestEnum e, int a) { } //ctor1
   explicit Klasse( time_t   t, int a = 0) { } //ctor2
};

int main() {
   TestEnum e = e1;
   Klasse k1( e, 1 ); //-&gt;korrekt ctor1
   Klasse k1( e    ); //-&gt;falsch ctor2
}
</code></pre>
<p>Greift bei Enums die Typabfrage nicht oder wieso ruft er ctor2 auf (klar beides sind intern unsigned ints. Wie kann man einen derartigen Fehler vermeiden (OHNE die default Paramter bei ctor 2 zu entfernen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292267/falscher-ctor-aufruf-wie-verhindern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 03:39:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292267.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Sep 2011 08:18:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 08:19:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">enum TestEnum { e1, e2 };

class Klasse {
   explicit Klasse( TestEnum e, int a) { } //ctor1
   explicit Klasse( time_t   t, int a = 0) { } //ctor2
};

int main() {
   TestEnum e = e1;
   Klasse k1( e, 1 ); //-&gt;korrekt ctor1
   Klasse k1( e    ); //-&gt;falsch ctor2
}
</code></pre>
<p>Greift bei Enums die Typabfrage nicht oder wieso ruft er ctor2 auf (klar beides sind intern unsigned ints. Wie kann man einen derartigen Fehler vermeiden (OHNE die default Paramter bei ctor 2 zu entfernen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115570</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 08:26:54 GMT]]></title><description><![CDATA[<p>Häh? ctor1 passt doch schon von der Argumentenzahl nicht, wie soll das gehen? ctor2 ist eben der einzige Konstruktor der nur ein Argument hat. Und wieso machst du einen Konstruktor mit 2 Elementen explicit?</p>
<p>Kann's sein, dass du bei ctor1 ein Defaultargument möchtest und bei ctor2 nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115574</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 08:31:32 GMT]]></title><description><![CDATA[<p>Der Compiler SOLL ja eine Fehlermeldung liefern. Tut es aber nicht weil er den time_t ctor verwendet.<br />
Mit explicit wollt eich eben genau diese implizite Typumwandlung von TestEnum nach time_t vermeiden...</p>
<p>Die &quot;echte&quot; Klasse ist eine Zeitklasse (die letztlich boost::date_time kappselt). Initilaisiere ich sie mit anderen Zeitobjekten benötige ich eben noch weitere Inforamtionen, wie zeitzone und ob die Zeit lokal oder utc ist.. Daher benötige ich weitere Parameter beim ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115577</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 08:39:59 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p>Mit explicit wollt eich eben genau diese implizite Typumwandlung von TestEnum nach time_t vermeiden...</p>
</blockquote>
<p>Und dadurch, dass du den Konstruktor explizit aufgerufen hast, hast du die Typumwandlung ja auch erfolgreich erzwungen. Durch einen impliziten Konstruktoraufruf wäre das nicht gegangen. Genau dafür ist explicit da, wie der Name schon sagt <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 du Verhindern möchtest, dass time_t und TestEnum nicht ineinander konvertiert werden können, dann mach sie eben nicht konvertierbar. Wrap eine kleine Klasse drumherum. Aber sei vorsichtig, wenn du Konvertierungsoperatoren für diese Klassen schreiben möchtest :p .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115582</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 08:42:57 GMT]]></title><description><![CDATA[<p>ok, dann habe ich das immer missvertstanden. Ich ging davon aus, dass ein expliziter ctor NUR DANN verwendet wird, wenn alle Argumente vom entsprechenden Typ vorhanden sind. In meinem Fall ging ich davon aus, dass es einen Compilerfehler gibt, da time_t nunmal kein EnumTest ist. Aber wenn ich es richtig verstehe, so würde es hie rnur nicht klappen, wenn time_t (angenommen es sei eine echte Klasse) keinen expliziten ctor für mein Enum hätte und auch keine implizite Umwandlung ermöglichen würde. Richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115585</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:42:57 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 08:44:22 GMT]]></title><description><![CDATA[<p>Stichwort scoped enumeration (C++11). Damit gibt es keine implizite Konvertierung in integer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115587</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 09:02:14 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Stichwort scoped enumeration (C++11). Damit gibt es keine implizite Konvertierung in integer.</p>
</blockquote>
<p>Ja, nur leider bin ich gezwungen mit VS2003 bzw VS2008 zu arbeiteten, da sieht es schlecht aus mit dem neuen Standard <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/2115591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115591</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 06 Sep 2011 09:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 09:47:07 GMT]]></title><description><![CDATA[<p>Was ich in Deinem Fall machen würde, weiß ich nicht. Das kommt auch drauf an, was die Konstruktoren da semantisch machen.</p>
<p>Um die Überladungsauflösung bei Konstruktoren zu steuern habe ich auch mal Tag-Klassen verwendet.</p>
<pre><code class="language-cpp">struct dings_t{};
const dings_t dings = {};

struct bums_t{};
const bums_t bums = {};

class foo {
public:
  foo(dings_t, int, int); // ctor 1
  foo(bums_t,  int, int); // ctor 2
};

:
:

int main() {
  foo f (dings,23,42); // ctor 1
  foo g (bums,99,11);  // ctor 2
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2115607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115607</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 06 Sep 2011 09:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 11:38:25 GMT]]></title><description><![CDATA[<p>Was du vermutlich brauchst, ist ein typsicheres enum, das sich nicht unter der Hand heimlich in irgendeinen integralen Typen verwandelt, der blöderweise hinter einem typedef das selbe wie ein time_t ist <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>schau mal hier: <a href="http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Type_Safe_Enum" rel="nofollow">http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Type_Safe_Enum</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115671</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 06 Sep 2011 11:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to falscher ctor Aufruf... wie verhindern? on Tue, 06 Sep 2011 11:52:30 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
Danke, das sollte mein Problem lösen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115682</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 06 Sep 2011 11:52:30 GMT</pubDate></item></channel></rss>