<?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[C Klasse in LUA verwenden]]></title><description><![CDATA[<p>Guten Tag,<br />
Ich hätte zwei kleine Fragen an euch im Bezug C++ Klasse(n) mit/in Lua verwenden:</p>
<p>Wie kann ich die erstelle klasse für LUA regestrieren?<br />
Hier mal ein kleines Beispiel:</p>
<pre><code>class Person
{
private:
	std::string	szName;
	int		iAge;
public:
	Person( void )
	{
	}
	void setAge( int age )
	{
		this-&gt;iAge = age;
	}
	void setName( std::string name )
	{
		if( !( char* )name.c_str() )
			return;

		this-&gt;szName = name;
	}
	int getAge( void )
	{
		return this-&gt;iAge;
	}
	std::string getName( void )
	{
		return this-&gt;szName;
	}
};
</code></pre>
<p>Mich würde ebenso interessieren wie ich den Konstruktor einmal global für LUA anlegen kann sprich das ich in der .lua Datei es so aufrufen könnte:</p>
<pre><code>-- Test-Script

-- nennen wir die globale Instanz Peter
Peter:setAge(20)
Peter:setName(&quot;Peter Müller&quot;)

-- un würde ich gerne einen neue Instanz anlegen
-- etwa so(?)
Ina = new Person() 
Ina:setAge(19)
Ina:setName(&quot;Ina Schmitz&quot;)
</code></pre>
<p>Wäre echt super, wenn mir jemand helfen könnte!<br />
Viele liebe Grüße <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/topic/323679/c-klasse-in-lua-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 17:04:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323679.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Feb 2014 13:18:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Mon, 10 Feb 2014 13:18:21 GMT]]></title><description><![CDATA[<p>Guten Tag,<br />
Ich hätte zwei kleine Fragen an euch im Bezug C++ Klasse(n) mit/in Lua verwenden:</p>
<p>Wie kann ich die erstelle klasse für LUA regestrieren?<br />
Hier mal ein kleines Beispiel:</p>
<pre><code>class Person
{
private:
	std::string	szName;
	int		iAge;
public:
	Person( void )
	{
	}
	void setAge( int age )
	{
		this-&gt;iAge = age;
	}
	void setName( std::string name )
	{
		if( !( char* )name.c_str() )
			return;

		this-&gt;szName = name;
	}
	int getAge( void )
	{
		return this-&gt;iAge;
	}
	std::string getName( void )
	{
		return this-&gt;szName;
	}
};
</code></pre>
<p>Mich würde ebenso interessieren wie ich den Konstruktor einmal global für LUA anlegen kann sprich das ich in der .lua Datei es so aufrufen könnte:</p>
<pre><code>-- Test-Script

-- nennen wir die globale Instanz Peter
Peter:setAge(20)
Peter:setName(&quot;Peter Müller&quot;)

-- un würde ich gerne einen neue Instanz anlegen
-- etwa so(?)
Ina = new Person() 
Ina:setAge(19)
Ina:setName(&quot;Ina Schmitz&quot;)
</code></pre>
<p>Wäre echt super, wenn mir jemand helfen könnte!<br />
Viele liebe Grüße <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/2382501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382501</guid><dc:creator><![CDATA[duplex0]]></dc:creator><pubDate>Mon, 10 Feb 2014 13:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Mon, 10 Feb 2014 19:38:04 GMT]]></title><description><![CDATA[<p>Hast du dich schon mit der Lua C API bzw einen Wrapper (zB luabind) beschaefftigt ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382585</guid><dc:creator><![CDATA[stuxn]]></dc:creator><pubDate>Mon, 10 Feb 2014 19:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Mon, 10 Feb 2014 20:45:13 GMT]]></title><description><![CDATA[<p>Ja natürlich hab ich mich ein wenig in den Umgang mit LUA eingelesen.<br />
Normale Funktionen etc, sind ja einfach zu erstellen/regestrieren.<br />
Falls du es dennoch nicht glaubst, hier mal ein kleiner Snippit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":b"
      alt="😛"
    /></p>
<pre><code>int lua_getCount( lua_State* l )
{
	lua_pushnumber( l, setCount() );
	return 1;
}
int lua_setCount( lua_State* l )
{
	int i = luaL_checkint( l, 1 );

	if( i &gt;= -1 )
	{
		setCount( i );
	}
	return 0;
}
int main( void )
{
	pLua-&gt;addScript( &quot;Test&quot;, pLua-&gt;getCurrentFilePath( &quot;random.lua&quot; ) );

	lua_register( pLua-&gt;getInstance(), &quot;setCount&quot;, lua_setCount );
	lua_register( pLua-&gt;getInstance(), &quot;getCount&quot;, lua_getCount );

	pLua-&gt;exec( &quot;Test&quot; );

	std::cin.get();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2382607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382607</guid><dc:creator><![CDATA[duplex0]]></dc:creator><pubDate>Mon, 10 Feb 2014 20:45:13 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Tue, 11 Feb 2014 16:55:09 GMT]]></title><description><![CDATA[<p>Hast du dich schonmal mit <a href="http://en.wikipedia.org/wiki/Lua_%28programming_language%29#Metatables" rel="nofollow">Metatables</a> in Lua auseinandergesetzt?<br />
Du kannst deine Klasse in C++ zu Userdata in Lua umwandeln und diesen einen Metatable zuordnen, welcher den möglichen Umgang damit definiert. Dazu gehört z.B. welche Funktion aufgerufen wird, wenn die Userdata in Lua zerstört/vom GC aufgeräumt werden, was bei Addition oder Index/Feld-Zugriff passiert, usw. Im Grunde ist der Metatable der public Bereich einer Klasse und die Userdata eine Variable im privaten Bereich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382713</guid><dc:creator><![CDATA[Youka]]></dc:creator><pubDate>Tue, 11 Feb 2014 16:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Fri, 14 Feb 2014 22:35:44 GMT]]></title><description><![CDATA[<p>Ein Beispiel:</p>
<pre><code>// Lua C API
#include &lt;lua.hpp&gt;
// C++ input/output streams
#include &lt;iostream&gt;

// MyObject as C++ class
class MyObject{
    private:
        double x;
    public:
        MyObject(double x) : x(x){}
        void set(double x){this-&gt;x = x;}
        double get() const{return this-&gt;x;}
};

// MyObject identifier for the Lua metatable
#define LUA_MYOBJECT &quot;MyObject&quot;

// Create &amp; return MyObject instance to Lua
int myobject_new(lua_State* L){
    double x = luaL_checknumber(L, 1);
    *reinterpret_cast&lt;MyObject**&gt;(lua_newuserdata(L, sizeof(MyObject*))) = new MyObject(x);
    luaL_setmetatable(L, LUA_MYOBJECT);
    return 1;
}

// Free MyObject instance by Lua garbage collection
int myobject_delete(lua_State* L){
    delete *reinterpret_cast&lt;MyObject**&gt;(lua_touserdata(L, 1));
    return 0;
}

// MyObject member functions in Lua
int myobject_set(lua_State* L){
    (*reinterpret_cast&lt;MyObject**&gt;(luaL_checkudata(L, 1, LUA_MYOBJECT)))-&gt;set(luaL_checknumber(L, 2));
    return 0;
}
int myobject_get(lua_State* L){
    lua_pushnumber(L, (*reinterpret_cast&lt;MyObject**&gt;(luaL_checkudata(L, 1, LUA_MYOBJECT)))-&gt;get());
    return 1;
}

// Register MyObject to Lua
void register_myobject(lua_State* L){
    lua_register(L, LUA_MYOBJECT, myobject_new);
    luaL_newmetatable(L, LUA_MYOBJECT);
    lua_pushcfunction(L, myobject_delete); lua_setfield(L, -2, &quot;__gc&quot;);
    lua_pushvalue(L, -1); lua_setfield(L, -2, &quot;__index&quot;);
    lua_pushcfunction(L, myobject_set); lua_setfield(L, -2, &quot;set&quot;);
    lua_pushcfunction(L, myobject_get); lua_setfield(L, -2, &quot;get&quot;);
    lua_pop(L, 1);
}

// Program entry
int main(int argc, char** argv){
    if(argc &gt; 1){
        lua_State*L = luaL_newstate();
        luaL_openlibs(L);
        register_myobject(L);
        if(luaL_dofile(L, argv[1]))
            std::cerr &lt;&lt; lua_tostring(L, -1);
        lua_close(L);
    }else
        std::cerr &lt;&lt; &quot;Expected filename from command line!&quot;;
    return 0;
}
</code></pre>
<pre><code>local obj = MyObject(42)
print(obj:get())	-- 42
obj:set(-1.5)
print(obj:get())	-- -1.5
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2383261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383261</guid><dc:creator><![CDATA[Youka]]></dc:creator><pubDate>Fri, 14 Feb 2014 22:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Sat, 15 Feb 2014 15:37:05 GMT]]></title><description><![CDATA[<p>Vielen lieben dank für diene Antwort und dem Bespiel!<br />
Aber eine Frage hätte ich noch, hast du/Ihr eventuell eine Ahnung, warum ich die Funktion <strong>lua_newmetatable</strong> besitze aber nicht <strong>luaL_newmetatable</strong>?</p>
<p>Liebe Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383332</guid><dc:creator><![CDATA[duplex0]]></dc:creator><pubDate>Sat, 15 Feb 2014 15:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Sat, 15 Feb 2014 18:28:15 GMT]]></title><description><![CDATA[<p>Sowohl Lua Version 5.1 als auch 5.2 haben nicht lua_newmetatable, aber luaL_newmetatable. Etwa benutzt du eine sehr alte Lua Version oder hast anderswo etwas falsch gemacht. Eine Fehlermeldung wäre hilfreicher als &quot;geht nicht&quot;.</p>
<p>luaL_* Funktionen sind lediglich Makros um die normalen Lua C Funktionen.<br />
luaL_newmetatable stellt sicher, dass im Registry-Table auf dem Stack (am Pseudo-Index) ein Table bei genannten Feldnamen existiert und schiebt eine Referenz darauf oben auf den Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383362</guid><dc:creator><![CDATA[Youka]]></dc:creator><pubDate>Sat, 15 Feb 2014 18:28:15 GMT</pubDate></item><item><title><![CDATA[Reply to C Klasse in LUA verwenden on Sun, 16 Feb 2014 13:44:51 GMT]]></title><description><![CDATA[<p>Du hattest recht. Meine LUA Version war 5.0. Es funktioniert nun. Vielen dank für deine Hilfe! <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/2383463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383463</guid><dc:creator><![CDATA[duplex0]]></dc:creator><pubDate>Sun, 16 Feb 2014 13:44:51 GMT</pubDate></item></channel></rss>