<?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[new operator mit Zeiger auf zu erstellende Klasse]]></title><description><![CDATA[<p>Hallo.</p>
<p>ich hab einen ganzen Sack voll abgeleiteter Klassen, alle vom selben Vater.</p>
<p>also:<br />
Class a<br />
Class aa:a<br />
Class ab:a<br />
Class ac:a..........</p>
<p>Ich möchte dann eine Instanz zB von af erzeugen<br />
also:<br />
p = new af();</p>
<p>Nun könnte ich einen Zeiger zum erzeugen gebrauchen.<br />
so in der Form:<br />
p = new *welcheClass();</p>
<p>So gehts wahrscheinlich nicht, aber wenn wo bekomme ich solch einen Zeiger her?<br />
Schön wenn jemand eine Idee hätte. Ich hab gehört, mit Delphi solls sowas geben.<br />
Rudi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237306/new-operator-mit-zeiger-auf-zu-erstellende-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 11:08:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237306.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Mar 2009 22:15:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Thu, 26 Mar 2009 22:15:17 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>ich hab einen ganzen Sack voll abgeleiteter Klassen, alle vom selben Vater.</p>
<p>also:<br />
Class a<br />
Class aa:a<br />
Class ab:a<br />
Class ac:a..........</p>
<p>Ich möchte dann eine Instanz zB von af erzeugen<br />
also:<br />
p = new af();</p>
<p>Nun könnte ich einen Zeiger zum erzeugen gebrauchen.<br />
so in der Form:<br />
p = new *welcheClass();</p>
<p>So gehts wahrscheinlich nicht, aber wenn wo bekomme ich solch einen Zeiger her?<br />
Schön wenn jemand eine Idee hätte. Ich hab gehört, mit Delphi solls sowas geben.<br />
Rudi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686690</guid><dc:creator><![CDATA[rudiM]]></dc:creator><pubDate>Thu, 26 Mar 2009 22:15:17 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Thu, 26 Mar 2009 22:47:28 GMT]]></title><description><![CDATA[<p>Das nennt sich Klassenreferenzen und virtuelle Konstruktoren, und in C++ gibt es das nicht. Du müßtest das von Hand machen (z.B., indem du eine eigene Metaklassenhierarchie mit virtuellen Factory-Funktionen schreibst).</p>
<p>Wenn du allerdings C++Builder verwendest, ist das mit Einschränkungen machbar. Derzeit gibt es zwar keine Möglichkeit, in C++ über eine Klassenreferenz einen virtuellen Konstruktor aufzurufen, da Klassenreferenzen in C++ noch nicht hierarchisch typisiert sind. Einen Wrapper für den virtuellen Konstruktor kannst du aber in Delphi schreiben. Klassisches Beispiel wäre folgender Konstruktorwrapper für TComponent (TComponent.Create ist virtuell):</p>
<pre><code>unit VirtualConstructorWrappers;

interface

uses
  Classes;

function CreateComponent (ComponentClass: TComponentClass; Owner: TComponent): TComponent;

implementation

function CreateComponent (ComponentClass: TComponentClass; Owner: TComponent): TComponent;
begin
  Result := ComponentClass.Create (Owner);
end;

end.
</code></pre>
<pre><code class="language-cpp">#include &lt;Classes.hpp&gt;
#include &lt;StdCtrls.hpp&gt;

#include &lt;cstdlib&gt;

#include &quot;VirtualConstructorWrappers.hpp&quot;

static const TComponentClass componentClasses[] = {
    __classid (TButton),
    __classid (TCheckBox),
    __classid (TEdit),
    __classid (TLabel),
};

TComponent* createRandomComponent (TComponent* Owner)
{
    unsigned componentCount = sizeof (componentClasses) / sizeof (componentClasses[0]);
    return CreateComponent (std::rand () % componentCount);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1686702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686702</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 26 Mar 2009 22:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Fri, 27 Mar 2009 10:15:25 GMT]]></title><description><![CDATA[<p>Hallo, schaut doch gut aus, doch bevor ichs einbaue hab ich noch ein Randproblem. Diese Lösung schau nicht so aus, als obs ich selbst machen könnte.</p>
<p>1.) Ich nehme an, mit dem Returnzeiger kann mit delete die Instanz wieder löschen.<br />
2.) Kann man damit auch ein Array einer Klasse erzeugen?<br />
3.) Wie mache ich es, wenn ich keine Instanz der Klasse erzeugen möchte, aber eine vorhandene <em>virtuelle static Funktion</em> aufrufen möchte?</p>
<p>Hoffentlich wird es jetzt nicht zu kompliziert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Rudi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686826</guid><dc:creator><![CDATA[rudiM]]></dc:creator><pubDate>Fri, 27 Mar 2009 10:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Fri, 27 Mar 2009 11:12:14 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>:<br />
Ich würde das mit templates lösen...</p>
<pre><code class="language-cpp">template&lt;typename BaseClass&gt;
struct Class {
  virtual BaseClass* create() = 0;
};

template&lt;typename ConcreteClass, typename BaseClass&gt;
struct ConcreteClass : public Class&lt;BaseClass&gt; {
  virtual ConcreteClass* create() {}
};
</code></pre>
<p>wobei über einen template operator T könnte man hier auch den BaseClass Parameter fallen lassen...</p>
<p>Generell sind templates bei sowas meistens eine super wahl. da wir eh keine reflection haben, brauchen wir auch keine reflection infrastruktur...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686852</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 27 Mar 2009 11:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Fri, 27 Mar 2009 18:26:50 GMT]]></title><description><![CDATA[<p>rudiM schrieb:</p>
<blockquote>
<p>1.) Ich nehme an, mit dem Returnzeiger kann mit delete die Instanz wieder löschen.</p>
</blockquote>
<p>Ja.</p>
<p>rudiM schrieb:</p>
<blockquote>
<p>2.) Kann man damit auch ein Array einer Klasse erzeugen?</p>
</blockquote>
<p>Nein. Das hat allerdings mit dieser Thematik nichts zu tun; das Kombinieren von new[] und Polymorphie ist grundsätzlich nicht sinnvoll.</p>
<p>rudiM schrieb:</p>
<blockquote>
<p>3.) Wie mache ich es, wenn ich keine Instanz der Klasse erzeugen möchte, aber eine vorhandene <em>virtuelle static Funktion</em> aufrufen möchte?</p>
</blockquote>
<p>Virtuelle statische Funktionen sind zwar in C++-Code aufrufbar, aber nur für Objekte oder Klassen, nicht für Klassenreferenzen. Dafür müßtest du dir eine Basisklasse in Delphi schreiben, z.B.:</p>
<pre><code>type
  TGraphicClass = class of TGraphic;
  TGraphic = class
  public
    constructor Create (); virtual; abstract;
    constructor CreateFromStream (AStream: TStream); virtual; abstract;
    class function SupportsFileFormat (FormatExt: String): Boolean; virtual; abstract;

      // Wrappers for C++ code
    class function CppCreate (GraphicClass: TGraphicClass); static;
    class function CppCreateFromStream (GraphicClass: TGraphicClass; Stream: TStream); static;
    class function CppSupportsFileFormat (GraphicClass: TGraphicClass; FormatExt: String); static;
  end;

...

class function TGraphic.CppCreate (GraphicClass: TGraphicClass);
begin
  Result := GraphicClass.Create ();
end;
class function TGraphic.CppCreateFromStream (GraphicClass: TGraphicClass; Stream: TStream);
begin
  Result := GraphicClass.CreateFromStream (Stream);
end;
class function TGraphic.CppSupportsFileFormat (GraphicClass: TGraphicClass; FormatExt: String);
begin
  Result := GraphicClass.SupportsFileFormat (FormatExt);
end;
</code></pre>
<pre><code class="language-cpp">class TMyBitmap : public TGraphic
{
public:
    virtual TMyBitmap (void);
    virtual TMyBitmap (TStream* AStream);
    virtual __classmethod bool SupportsFileFormat (String FormatExt);
};

...

    std::vector &lt;TGraphicClass&gt; gc;
    gc.push_back (__classid (TMyBitmap));
    ...
    for (unsigned i = 0; i != gc.size (); ++i)
        if (TGraphic::CppSupportsFileFormat (gc, theFileExt))
            return TGraphic::CppCreateFromStream (gc, theStream);
    return 0;
</code></pre>
<p>__classmethod ist neu in C++Builder 2009; anscheinend gibt es auch Bestrebungen, in einer der kommenden Versionen Klassenreferenzen auch in C++ vollständig zu typisieren, so daß obige Wrapper überflüssig würden.</p>
<p>@Shade: das ist im Prinzip, was ich oben erwähnte: &quot;Du müßtest das von Hand machen (z.B., indem du eine eigene Metaklassenhierarchie mit virtuellen Factory-Funktionen schreibst).&quot;</p>
<p>Warum du da jetzt aber ein Template als Basisklasse benutzen willst, erschließt sich mir nicht ganz. Das Template wäre ohnehin nur für die Klassen tauglich, die sinnvoll ohne Parameter konstruierbar sind, und für die du keine statischen virtuellen Funktionen benötigst.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>da wir eh keine reflection haben, brauchen wir auch keine reflection infrastruktur...</p>
</blockquote>
<p>Jetzt mal langsam. Bei Reflection sind wir doch noch gar nicht <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/1687112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687112</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 27 Mar 2009 18:26:50 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Sat, 28 Mar 2009 15:09:37 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>@Shade: das ist im Prinzip, was ich oben erwähnte: &quot;Du müßtest das von Hand machen (z.B., indem du eine eigene Metaklassenhierarchie mit virtuellen Factory-Funktionen schreibst).&quot;</p>
<p>Warum du da jetzt aber ein Template als Basisklasse benutzen willst, erschließt sich mir nicht ganz. Das Template wäre ohnehin nur für die Klassen tauglich, die sinnvoll ohne Parameter konstruierbar sind, und für die du keine statischen virtuellen Funktionen benötigst.</p>
</blockquote>
<p>Ne ne.<br />
Dank den Templates biete ich generische create() methoden an, die man fuer fall zu fall trivial neu definieren kann. und da ich templates habe, brauche ich keine runtime type liste.</p>
<p>und natuerlich kann ich dann auch virtuelle klassen-funktionen anbieten, da ich ja mit metaklassen agiere und ich hier problemlos auch laufzeit polymorphie anbieten kann.</p>
<p>ob die basisklasse selber ein template sein soll oder lieber nicht, muss man sich ueberlegen. ist beides technisch ja trivial.</p>
<p>ist dank templates wirklich kein grosser aufwand und laeuft auf allen compilern. was man halt nicht hat ist reflection. aber so simple meta-creators sind kein problem. man braucht dazu dank templates ja auch keine hierachie selber schreiben, sondern instanziiert die klassen einfach mit dem passenden typen <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/1687482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687482</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sat, 28 Mar 2009 15:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Sat, 28 Mar 2009 16:03:40 GMT]]></title><description><![CDATA[<p>Ah, jetzt erschließt sich mir, was du meinst. Ja, dafür sind Templates durchaus sinnvoll.</p>
<p>Nur:</p>
<p>Shade of Mine schrieb:</p>
<blockquote>
<p>und da ich templates habe, brauche ich keine runtime type liste.</p>
</blockquote>
<p>?<br />
Brauche ich die denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687514</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 28 Mar 2009 16:03:40 GMT</pubDate></item><item><title><![CDATA[Reply to new operator mit Zeiger auf zu erstellende Klasse on Sat, 28 Mar 2009 17:07:22 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Brauche ich die denn?</p>
</blockquote>
<p>Aus der Frage schliesse ich mal, dass du keine brauchst.<br />
Dachte zwar dass das noetig waere aber wenn dem nicht so ist: gut <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/1687544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687544</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sat, 28 Mar 2009 17:07:22 GMT</pubDate></item></channel></rss>