<?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[Virtueller Konstruktor bzw. ähnliche Funktion gesucht]]></title><description><![CDATA[<p>Hi,<br />
ich beschäftige mich zu Lernzwecken mit einem kleinen WinAPI-Wrapper-Versuch. <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>
<p>Aufbau ist ungefähr so:</p>
<pre><code class="language-cpp">class Widget {
public:
    Widget();
    virtual ~Widget();
private:
    virtual void Create();
};

class Window : public Widget {
public:
    Window();
    virtual ~Window();
private:
    virtual void Create();
}
</code></pre>
<p>Jetzt würde ich gerne mehrere Konstuktoren haben, wo ich mit jeweils anderen Werten die virtuelle Create-Methode aufrufe, deshalb ist die da. Soweit kein Problem. In der Create-Methode erstelle ich mir dann mit CreateWindowEx das Fenster, wobei sich aber das Problem ergibt, dass wenn ich ein Objekt vom Typ &quot;Window&quot; erstelle er den Konstruktor das Basisklasse Widget aufruft, was wegen der Vererbung ja auch logisch ist. Jetzt wird aber im Konstruktor von Widget die virtuelle Methode Create (von Widget) aufgerufen, obwohl ich ein Window-Objekt erstelle, die Reihenfolge ist also so:</p>
<pre><code>Window-Objekt erstellen:
1. Window-Konstruktor wird aufgerufen
2. Widget-Konstruktor wird aufgerufen und ausgeführt
3. Widget-Create wird aufgerufen (innerhalb des Widget-Ctors)
4. Window-Konstruktor wird ausgeführt
5. Window-Create wird aufgerufen (innerhalb des Window-Ctors)
</code></pre>
<p>Das Problem ist also, dass beide Create-Methode aufgerufen werden, obwohl sie virtual sind. Ich denke, dass es daran liegt, dass der Widget-Ctor für das Window-Objekt ausgeführt wird, an einer Stelle, wo es das Window-Objekt noch nicht gibt, also, dass an der Stelle, wo der Widget-Ctor wegen der Vererbung aufgerufen wird noch nicht klar ist, dass es sich um ein Window-Objekt handelt und deshalb das Create von Widget genommen wird und nicht das von Window.</p>
<p>Die Frage ist jetzt, wie ich das umgehen kann. Eine Möglichkeit wäre, dass ich den Standard-Ctor (ohne Argumente) als protected setze und dort nicht die Create-Methode aufrufe, was meiner Meinung nach aber nicht wirklich eine Lösung sein kann, weil ich auch z.B. ein Fenster mit</p>
<pre><code class="language-cpp">Window* win = new Window();
</code></pre>
<p>erstellen können möchte.<br />
Eine weitere Möglichkeit wäre im Create von Window das Objekt, welches durch das Create von Widget erstellt wurde wieder zu löschen bevor ein neues durch Window erstellt wird, was sehr unsauber wäre, denke ich.<br />
Als letztes würde mir noch einfallen die Create-Methode public zu machen und explizit aufzurufen, was aber imo ziemlich unhandlich wäre, da man dann immer so etwas hätte:</p>
<pre><code class="language-cpp">Window* win = new Window();
win-&gt;create();
win-&gt;show();
// usw.
</code></pre>
<p>Wenn man jetzt viele Fenster oder später auch Buttons, etc. hat, dann ist das create schon sehr lästig, wenn man das noch extra für jedes Objekt aufrufen muss.</p>
<p>Jemand eine Idee, wie man das elegant lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/123553/virtueller-konstruktor-bzw-ähnliche-funktion-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 15:06:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/123553.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Oct 2005 00:32:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 00:32:47 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich beschäftige mich zu Lernzwecken mit einem kleinen WinAPI-Wrapper-Versuch. <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>
<p>Aufbau ist ungefähr so:</p>
<pre><code class="language-cpp">class Widget {
public:
    Widget();
    virtual ~Widget();
private:
    virtual void Create();
};

class Window : public Widget {
public:
    Window();
    virtual ~Window();
private:
    virtual void Create();
}
</code></pre>
<p>Jetzt würde ich gerne mehrere Konstuktoren haben, wo ich mit jeweils anderen Werten die virtuelle Create-Methode aufrufe, deshalb ist die da. Soweit kein Problem. In der Create-Methode erstelle ich mir dann mit CreateWindowEx das Fenster, wobei sich aber das Problem ergibt, dass wenn ich ein Objekt vom Typ &quot;Window&quot; erstelle er den Konstruktor das Basisklasse Widget aufruft, was wegen der Vererbung ja auch logisch ist. Jetzt wird aber im Konstruktor von Widget die virtuelle Methode Create (von Widget) aufgerufen, obwohl ich ein Window-Objekt erstelle, die Reihenfolge ist also so:</p>
<pre><code>Window-Objekt erstellen:
1. Window-Konstruktor wird aufgerufen
2. Widget-Konstruktor wird aufgerufen und ausgeführt
3. Widget-Create wird aufgerufen (innerhalb des Widget-Ctors)
4. Window-Konstruktor wird ausgeführt
5. Window-Create wird aufgerufen (innerhalb des Window-Ctors)
</code></pre>
<p>Das Problem ist also, dass beide Create-Methode aufgerufen werden, obwohl sie virtual sind. Ich denke, dass es daran liegt, dass der Widget-Ctor für das Window-Objekt ausgeführt wird, an einer Stelle, wo es das Window-Objekt noch nicht gibt, also, dass an der Stelle, wo der Widget-Ctor wegen der Vererbung aufgerufen wird noch nicht klar ist, dass es sich um ein Window-Objekt handelt und deshalb das Create von Widget genommen wird und nicht das von Window.</p>
<p>Die Frage ist jetzt, wie ich das umgehen kann. Eine Möglichkeit wäre, dass ich den Standard-Ctor (ohne Argumente) als protected setze und dort nicht die Create-Methode aufrufe, was meiner Meinung nach aber nicht wirklich eine Lösung sein kann, weil ich auch z.B. ein Fenster mit</p>
<pre><code class="language-cpp">Window* win = new Window();
</code></pre>
<p>erstellen können möchte.<br />
Eine weitere Möglichkeit wäre im Create von Window das Objekt, welches durch das Create von Widget erstellt wurde wieder zu löschen bevor ein neues durch Window erstellt wird, was sehr unsauber wäre, denke ich.<br />
Als letztes würde mir noch einfallen die Create-Methode public zu machen und explizit aufzurufen, was aber imo ziemlich unhandlich wäre, da man dann immer so etwas hätte:</p>
<pre><code class="language-cpp">Window* win = new Window();
win-&gt;create();
win-&gt;show();
// usw.
</code></pre>
<p>Wenn man jetzt viele Fenster oder später auch Buttons, etc. hat, dann ist das create schon sehr lästig, wenn man das noch extra für jedes Objekt aufrufen muss.</p>
<p>Jemand eine Idee, wie man das elegant lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894644</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 18 Oct 2005 00:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 00:45:26 GMT]]></title><description><![CDATA[<p>was ist denn mit</p>
<pre><code class="language-cpp">Window* win = createWindow();
</code></pre>
<p>innerhalb von createWindow kann ja dann allerhand passieren. vor allem new, und result-&gt;create().</p>
<blockquote>
<p>Jetzt würde ich gerne mehrere Konstuktoren haben, wo ich mit jeweils anderen Werten die virtuelle Create-Methode aufrufe, deshalb ist die da.</p>
</blockquote>
<p>dann sollte es keine Create-methode sein, sondern noch ne basisklasse mit nem konstruktor, der verschiedene werte kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894650</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 18 Oct 2005 00:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 05:08:25 GMT]]></title><description><![CDATA[<p>Zur Info:<br />
Im Konstruktor ist die Virtualität von Methoden deaktiviert, da die virtuellen Methodentabellen noch nicht gesetzt sind. Und das aus gutem Grund, da die virtuellen Methoden sonst in noch nicht konstruierte Objekte hineingreifen würden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894674</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 18 Oct 2005 05:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 08:52:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>was ist denn mit</p>
<pre><code class="language-cpp">Window* win = createWindow();
</code></pre>
<p>innerhalb von createWindow kann ja dann allerhand passieren. vor allem new, und result-&gt;create().</p>
</blockquote>
<p>Fände ich nicht so schön, weil Extra-Funktion und so, die Klasse sollte das schon selbst erledigen. Eine Möglichkeit wäre hier wohl eine statische Memberfunktion, die mir bei jedem Aufruf ein neues Window-Objekt gibt. Aber auch nicht sehr schön meiner Meinung nach.</p>
<p>volkard schrieb:</p>
<blockquote>
<blockquote>
<p>Jetzt würde ich gerne mehrere Konstuktoren haben, wo ich mit jeweils anderen Werten die virtuelle Create-Methode aufrufe, deshalb ist die da.</p>
</blockquote>
<p>dann sollte es keine Create-methode sein, sondern noch ne basisklasse mit nem konstruktor, der verschiedene werte kann.</p>
</blockquote>
<p>Geht ja leider nicht. Ich hätte gerne einen Konstruktur, wo ich alle Werte als Parameter habe und dann andere, die wiederum nur diesen Konstruktor aufrufen. Dafür habe ich ja dann die Create-Methode, die in Wirklichkeit mehrere Parameter hat, z.b. Parent, x, y, width, height, usw., welche dann in jedem Konstruktur aufgerufen wird. Sonst hätte ich den Aufruf von CreateWindowEx (WinAPI) in jedem Ctor drin. Oder gibt es da doch ne Möglichkeit, wäre ich ebenfalls dankbar für. <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 />
Ich weiß nur, dass ich das mal ausprobiert hatte und es nicht lief, aber das kann ich ja auch nochmal ausprobieren, so ganz geläufig ist mir nicht mehr, das da genau nicht lief.</p>
<p>Ich hab' mich übrigens vertan, wenn in dem Ctor von Window nicht die Create-Methode aufgerufen wird, dann wird lediglich das Create von Widget ausgeführt. Geht das wirklich nicht? <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/894843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894843</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 18 Oct 2005 08:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 09:26:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Im Konstruktor ist die Virtualität von Methoden deaktiviert, da die virtuellen Methodentabellen noch nicht gesetzt sind. Und das aus gutem Grund, da die virtuellen Methoden sonst in noch nicht konstruierte Objekte hineingreifen würden.</p>
</blockquote>
<p>Dazu:</p>
<p><a href="http://www.artima.com/cppsource/nevercall.html" rel="nofollow">http://www.artima.com/cppsource/nevercall.html</a></p>
<p>In Deinem Fall ist es vielleicht wirklich sinnvoll Konstruktion und Create zu trennen. In der Winapi sind ja die meisten Creates von Windows ziemlich ähnlich, weshalb volkards Vorschlag mit der Basisklasse hier wirklich Sinn macht.<br />
Schau Dir mal die MFC an (bloß nicht als Beispiel für guten Code mißverstehen), aber nicht ohne Grund steckt dort die meiste Functionalität in CWnd. Wie will man schon einen schönen C++ Wrapper um eine häßliche C-Api schreiben :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894870</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Tue, 18 Oct 2005 09:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 09:33:39 GMT]]></title><description><![CDATA[<p>TheBigW schrieb:</p>
<blockquote>
<p>In der Winapi sind ja die meisten Creates von Windows ziemlich ähnlich, weshalb volkards Vorschlag mit der Basisklasse hier wirklich Sinn macht.</p>
</blockquote>
<p>ich hab die basisklasse wegen RAII vorgeschlagen und weil man im alle von nichttrivialen members die nicht mit nem häßlichen fehleranziehenden default-ctor ausstatten muß. beides gründe, die für mich zwingend zu basisklasse oder layering (aber auf jeden fall einer konstruktorargumentweitergabe in der initialisiererliste) führen würden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894880</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 18 Oct 2005 09:33:39 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 09:43:34 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Da war ich wohl etwas unpräzise. Mit &quot;ziemlich ähnlich&quot; meine ich natürlich auch das Resourcenmanagment, was man so natürlich auch sehr schön der Basisklasse aufs Auge drücken kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894895</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Tue, 18 Oct 2005 09:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 17:23:43 GMT]]></title><description><![CDATA[<p>OK, ich muss zugeben, dass ich die Sache mit der zusätzlichen Basisklasse zuerst nicht verstanden habe, wie's gemeint war. Es könnte eine Lösung sein mit der ich mich zufrieden geben kann. <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>Vielen Dank.</p>
<p>//Edit: Danke auch für den Link, der genau mein Problem erklärt und warum dies so nicht funktionieren kann. <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/895364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/895364</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Tue, 18 Oct 2005 17:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Virtueller Konstruktor bzw. ähnliche Funktion gesucht on Tue, 18 Oct 2005 19:41:59 GMT]]></title><description><![CDATA[<p>eine weitere möglichkeit wäre, zur klasse widget einen konstruktor hinzuzufügen, der mit entsprechenden parametern aufgerufen das widget so erzeugt, wie die window-klasse es braucht. den kannst du dann in der <strong>initialisierungsliste</strong> des window-konstruktors aufrufen.</p>
<p>ich finde es aber grundsätzlich etwas seltsam, das du eine methode create() definierst. dafür ist doch der konstruktor da. wenn du das fenster über eine separate methode öffen willst, dann sollte der konstruktor ein &quot;leeres&quot; window-objekt erzeugen (window-handle == 0) und die methode open() erzeugt das eigentliche fenster. damit würde sich dein problem von selbst lösen.</p>
<p>so ein problem, wie du es beschreibst, ist fast immer ein hinweis darauf, daß mit dem programm-konzept etwas nicht stimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/895509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/895509</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 18 Oct 2005 19:41:59 GMT</pubDate></item></channel></rss>