<?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[[gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot;]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Aufbau</p>
<pre><code>GtkControl (Basisklasse der folgenden 2)
  CListView
  CButton
und eine separate Klasse
LuaControl
</code></pre>
<p>diese werden im verlauf der Vererbung zusammengebastelt:</p>
<pre><code class="language-cpp">class LuaListView:public LuaControl,public CListView
class LuaButton:public LuaControl,public CButton
</code></pre>
<p>nun möchte ich einen Pointer (void <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="😉"
    /> der auf ein LuaListview oder ein LuaButton zeigt auf GtkControl casten.</p>
<p>wie mache ich das?</p>
<p>wenn ich den Typ kenn, kann ich es so machen:</p>
<pre><code class="language-cpp">LuaListView *C1=reinterpret_cast&lt;LuaListView*&gt;(iChild1);
LuaButton *C2=reinterpret_cast&lt;LuaButton*&gt;(iChild2);
</code></pre>
<p>da ich es aber nicht weis, und nur eine Methode der GtkControl-Basisklasse benötige, möchte drauf casten<br />
folgendes stimmt aber nicht:</p>
<pre><code class="language-cpp">GtkControl *Child2=reinterpret_cast&lt;GtkControl*&gt;(iChild2);
</code></pre>
<p>Ich hoffe, ich habe mich verständlich ausgedrückt <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>Hat jemand eine Idee?</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274092/gelöst-cast-von-void-auf-basisklasse-einer-quot-teilklasse-quot</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 17:15:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274092.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Sep 2010 14:02:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Wed, 29 Sep 2010 18:13:48 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Aufbau</p>
<pre><code>GtkControl (Basisklasse der folgenden 2)
  CListView
  CButton
und eine separate Klasse
LuaControl
</code></pre>
<p>diese werden im verlauf der Vererbung zusammengebastelt:</p>
<pre><code class="language-cpp">class LuaListView:public LuaControl,public CListView
class LuaButton:public LuaControl,public CButton
</code></pre>
<p>nun möchte ich einen Pointer (void <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="😉"
    /> der auf ein LuaListview oder ein LuaButton zeigt auf GtkControl casten.</p>
<p>wie mache ich das?</p>
<p>wenn ich den Typ kenn, kann ich es so machen:</p>
<pre><code class="language-cpp">LuaListView *C1=reinterpret_cast&lt;LuaListView*&gt;(iChild1);
LuaButton *C2=reinterpret_cast&lt;LuaButton*&gt;(iChild2);
</code></pre>
<p>da ich es aber nicht weis, und nur eine Methode der GtkControl-Basisklasse benötige, möchte drauf casten<br />
folgendes stimmt aber nicht:</p>
<pre><code class="language-cpp">GtkControl *Child2=reinterpret_cast&lt;GtkControl*&gt;(iChild2);
</code></pre>
<p>Ich hoffe, ich habe mich verständlich ausgedrückt <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>Hat jemand eine Idee?</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954369</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:13:48 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Sun, 19 Sep 2010 14:14:51 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>Ich hoffe, ich habe mich verständlich ausgedrückt <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 />
Hat jemand eine Idee?</p>
</blockquote>
<p>Du hast mit <code>void*</code> jegliche Typinformation verloren.</p>
<p><code>T*</code> -&gt; <code>void*</code> -&gt; <code>T*</code> ist aber kein Problem.</p>
<p>Das heißt, Du könntest, bevor Du einen void-Zeiger erzeugst auf eine gemeinsame Basisklasse casten -- zB T=LuaControl -- und dann wieder zurück auf T* casten. Wenn LuaControl dann noch polymorph ist, könnte man mit einem <code>dynamic_cast</code> weiter machen, aber das riecht dann eher nach schlechtem Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954373</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Sun, 19 Sep 2010 14:29:50 GMT]]></title><description><![CDATA[<p>den weg über void* muss ich gehen, das das ganze durch lua geht <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="😉"
    /><br />
da kann ich nur einfache Typen verwenden</p>
<p>den void* bekomme ich von lua und will den halt in meine Basisklasse zurückcasten<br />
ich möchte nicht luacontrol sondern GtkControl, also die 2. KLasse der Polymorphen Klasse Lua*</p>
<p>wie funktioniert das mit dem dynamiccast?</p>
<p>bei meinem Test mit dynamic_cast wollte er meinen void* nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954379</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Sun, 19 Sep 2010 14:38:39 GMT]]></title><description><![CDATA[<p>Ich habe nicht den Eindruck, dass Du verstanden hast, was ich geschrieben habe. Lies es bitte nochmal und/oder sag, womit Du Verständnisprobleme hast.</p>
<p><code>LuaButton*</code> -&gt; <code>void*</code> -&gt; <code>GtkControl*</code></p>
<p>ist nicht erlaubt.</p>
<p><code>LuaButton*</code> -&gt; <code>void*</code> -&gt; <code>LuaButton*</code> -&gt; <code>GtkControl*</code> und<br />
<code>GtkControl*</code> -&gt; <code>void*</code> -&gt; <code>GtkControl*</code></p>
<p>schon. Also, Wenn Du von einem Typ <code>T*</code> nach <code>void*</code> konvertierst und das rückgängig machen willst, musst Du T genau kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954385</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Sun, 19 Sep 2010 14:50:04 GMT]]></title><description><![CDATA[<p>das Problem ist, ich weis nicht, ob es ein LuaButton oder LuaListView ist</p>
<p>wenn das gar nicht geht, fällt mir nur noch die Möglichkeit ein, ein struct obendrüber zu setzen</p>
<pre><code class="language-cpp">struct TControlData
{
  int Typ, //Typ des Controls (LuaButton, LuaListview,...) als const/enum
  void *data;//pointer auf Control
}
</code></pre>
<p>nur wie es mit der speicherreservierung aussieht weis ich dann nicht mehr.<br />
die Klassen selbst werden mit new erzeugt und per delete freigegeben (sonst werden die beim beenden der Funktion automatisch freigegeben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954391</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Sun, 19 Sep 2010 14:54:01 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>das Problem ist, ich weis nicht, ob es ein LuaButton oder LuaListView ist</p>
</blockquote>
<p>Dann nimm doch LuaControl* als Zwischenstopp!<br />
(so, wie ich es in der ersten Antwort schon erwähnt habe)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class LuaControl
{
public:
  virtual ~LuaControl() {}
  virtual void foo() = 0;
};

class LuaButton : public LuaControl
{
public:
  void foo() {std::cout&lt;&lt;&quot;LuaButton!\n&quot;;}
};

class LuaListView : public LuaControl
{
public:
  void foo() {std::cout&lt;&lt;&quot;LuaListView!\n&quot;;}
  void spezifisch() {std::cout&lt;&lt;&quot;LuaListView::spezifisch!\n&quot;;}
};

template&lt;class T&gt; void* voidify(T* ptr)
{
  LuaControl* zwischenstopp = ptr; // WICHTIG!
  return zwischenstopp;
}

LuaControl* de_voidify(void* ptr)
{
  return static_cast&lt;LuaControl*&gt;(ptr);
}

void who_are_you(void* ptr)
{
  LuaControl* q = de_voidify(ptr);
  q-&gt;foo();
  LuaListView* plv = dynamic_cast&lt;LuaListView*&gt;(q);
  if (plv) {
    plv-&gt;spezifisch();
  }
}

int main()
{
  LuaButton lb;
  LuaListView llv;
  who_are_you(voidify(&amp;lb));
  who_are_you(voidify(&amp;llv));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1954394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954394</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:54:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Sun, 19 Sep 2010 18:09:18 GMT]]></title><description><![CDATA[<p>in deinem Code sehe ich aber nicht die Abhängigkeit (Mehrfachvererbung) von LuaButton zu CButton (GtkControl), also nur 1 Basisklasse</p>
<p>würde es denn gehen, wenn ich in LuaControl hinterlege, dass es sich um ein LuaButton oder LuaListview handelt?</p>
<p>LuaControl hat mit GtkControl nicht das geringste zu tun, es sind nur 2 Basisklassen.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954399</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Sun, 19 Sep 2010 18:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Mon, 20 Sep 2010 06:14:25 GMT]]></title><description><![CDATA[<p>ich habe hier im Forum <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-271410-and-view-is-previous.html" rel="nofollow">dieses Topic</a> gefunden, welches mein Problem auch behandelt.<br />
der Autor kommt zu dem Schluss dass es wohl nicht geht.</p>
<p>was wäre der beste Ausweg aus der Misere?</p>
<p>- ein struct obendrüber (pointer und typ siehe oben)<br />
- eine Ableitung einer Klasse (LuaControl oder C*) mit einem Feld der zweiten Klasse (erstellung im Constructor und freigabe im Destructor), siehe Beispiel</p>
<pre><code class="language-cpp">class LuaButton:public CButton
{
  public:
    LuaControl *LUA;
};
</code></pre>
<p>letzteres hat natürlich den Nachteil, dass bestimmte Teile (erzeugen und freigeben von LuaControl,, evtl. der [nur lesende] zugriff auf die Variable) immer wieder neu implementiert werden müssten.</p>
<p>da finde ich die Struct-Variable code-sparender.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954578</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Mon, 20 Sep 2010 06:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Mon, 20 Sep 2010 06:26:21 GMT]]></title><description><![CDATA[<p>Du sagst dein Code geht durch Lua? Dann nehme ich mal an, dass du ein Light Userdata verwendest, um den Zeiger durchzureichen. Wieso verwendest du nicht ein normales Userdata? Könntest <code>sizeof(void*)</code> Speicher reservieren lassen, darin den Zeiger speichern und dem Userdata eine eigene Metatable geben. Über die Metatable kannst du die Typen dann unterscheiden. Hier gibt es auch ein paar Beispiele, wie man dies macht: <a href="http://www.lua.org/pil/" rel="nofollow">http://www.lua.org/pil/</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954580</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 20 Sep 2010 06:26:21 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Mon, 20 Sep 2010 09:07:31 GMT]]></title><description><![CDATA[<p>richtig, ich benutze lightuserdata (pushlightuserdata, lua_touserdata)</p>
<p>mit metatables kenne ich mich gar nicht aus, kannst du mir ein beispiel geben, wie das aufgebaut ist und wie soetwas angelegt wird?</p>
<p>mit dem userdata ist ja <a href="http://www.lua.org/pil/28.1.html" rel="nofollow">hier</a> beschrieben...</p>
<p>ich muss lua-seitig die typen eigentlich nicht unterscheiden, nur auf c++-seite<br />
prinzipiell denke ich, dass du es so ähnlich aufbauen willst wie meine struct-idee von oben. sehe dem gegenüber jetzt keinen vorteil</p>
<p>btw. die Vorlage für mein Projekt:<br />
<a href="http://code.google.com/p/scite-ru/source/browse/trunk/lualib/gui/gui_ext.cpp#518" rel="nofollow">http://code.google.com/p/scite-ru/source/browse/trunk/lualib/gui/gui_ext.cpp#518</a></p>
<p>wie ich gerade sehe, wird da auch newuserdata verwendet, finde nur die stelle nicht, wo die usedata wieder freigegeben wird...</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954624</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Mon, 20 Sep 2010 09:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Mon, 20 Sep 2010 09:48:38 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>, finde nur die stelle nicht, wo die usedata wieder freigegeben wird...</p>
</blockquote>
<p>Muss sie auch nicht, weil ein Userdata vom Lua Garbage Collector verwaltet wird.</p>
<p>Wenn du mit Lua arbeitest, empfehle ich dir sehr, dass du mal das verlinkte Buch durchliest. Das hat man ziemlich schnell durch und gibt einem einen sehr guten Einstieg in Lua.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954670</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 20 Sep 2010 09:48:38 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Wed, 22 Sep 2010 18:05:48 GMT]]></title><description><![CDATA[<p>momentan sieht es bei mir so aus und ich bekomme einen Segmentation Fault beim zugriff auf ein Feld von WinWrap:</p>
<pre><code class="language-cpp">struct WinWrap {
  int wc;
	void *window;
	void *data;
};

static int wrap_window(lua_State* L, void *win, int WindowClass) 
{
	WinWrap *wrp = (WinWrap*)lua_newuserdata(L,sizeof(WinWrap));
	wrp-&gt;window = win;
  wrp-&gt;wc=WindowClass;
	wrp-&gt;data = NULL;
	//luaL_getmetatable(L,WINDOW_CLASS);
	lua_setmetatable(L,-2);
	return 1;
}

//creating a class and pushing winwrap-pointer to lua stack:
  LuaListView *Listview=new LuaListView(L,GTK_WIDGET(iParent));
  /* //old code
    lua_pushlightuserdata(L,Listview);//put pointer of Listview to stack
    return 1;//return 1 value (handle)
  */
  return wrap_window(L,Listview, lcListView);

//now accessing the winwrap
static int do_ListViewAddColumn(lua_State *L) //gui.Listview_Add_Column(Listview,&quot;caption&quot;)
{
  void *iLuaControl=lua_touserdata(L,1);
  const char *caption=luaL_checkstring(L,2);

  g_print(&quot;Listview-&gt;AddColumn\n&quot;);

  WinWrap *wrp=(WinWrap*)iLuaControl;
  //LuaListView *Listview=reinterpret_cast&lt;LuaListView*&gt;(iLuaControl);
  if (wrp-&gt;wc==lcListView) //&lt;= Segmentation Fault
  {
    g_print(&quot;Listview:CastToLuaListview\n&quot;);
    LuaListView *Listview=reinterpret_cast&lt;LuaListView*&gt;(wrp-&gt;window);
    Listview-&gt;AddColumn(caption);
  }
  //lua_pushlightuserdata(L,vbox);//put pointer of vbox on stack
  return 0;//return 1 value (handle)
}
</code></pre>
<p>hat jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956088</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Wed, 22 Sep 2010 18:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Wed, 22 Sep 2010 18:27:40 GMT]]></title><description><![CDATA[<p>Mit diesen wenigen Informationen schwer zu sagen. Vor allem auch wegen Lua, da man schnell darüber Fehler erzeugt, bzw. mit der API die falschen Daten lädt oder speichert. Zum Beispiel kommt mir dein Code sehr verdächtig vor an der Zeile 14. Nach <code>lua_newuserdata</code> lädst du nirgends die Metatable, dabei muss die Metatable an der Position -1 zu finden sein.</p>
<p>Am besten prüfst du mal, welcher Zeigerwert du am Anfang hast und welcher du hast, wenn du ihn ausliest.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956105</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 22 Sep 2010 18:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Cast von void* auf BasisKlasse einer &amp;quot;Teilklasse&amp;quot; on Wed, 22 Sep 2010 19:53:25 GMT]]></title><description><![CDATA[<p>Danke, die metatable war das problem...hab sie erstmal raus (war aus meiner Vorlage) und schon funktionert es.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956155</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Wed, 22 Sep 2010 19:53:25 GMT</pubDate></item></channel></rss>