Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Viktor

Alter Hase

  • »Viktor« ist der Autor dieses Themas

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

1

19.12.2008, 13:22

[C++] In static-Funktion auf Membervariable zugreifen

Momentan beschäftige ich mich mit Lua. Das Problem kann aber auch ohne weiteres auch ohne Lua-Kenntnisse gelöst werden.
Für Lua habe ich eine Klasse erstellt, zum Öffnen, Interpretieren und Schließen von Dateien. Außerdem ist noch eine eigene Funktion hineingesetzt, die dann schließlich im Lua-Skript aufgerufen werden soll.
Das schaut dann so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef LUA_H
#define LUA_H


extern "C" 
{
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

#include <string>
#include "Etwas.h"

class Lua
{
public:

    Lua();
    ~Lua();

    void vInterpret(std::string strFilename);

private:

    lua_State* pLua;
    Etwas* pEtwas;

    static int iFunktion(lua_State* L);
};


#endif


In vInterpret(...) registriere ich dann die Funktion iFunktion(...):

C-/C++-Quelltext

1
2
3
4
5
6
7
void Lua::vInterpret(std::string strFilename)
{
    lua_register(this->pLua, "Funktion", iFunktion);
    int iFileState = luaL_dofile(this->pLua, strFilename.c_str());

    ...
}


Die eigentliche Funktion sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
int Lua::iFunktion(lua_State *L)
{
    ...
    return 0;
}


In iFunktion (welches ja static ist) will ich jetzt auf pEtwas aus Lua zugreifen, welches wiederum nicht static ist. Das sollte es auch nicht, da es sonst zu Überschneidungen kommt, wenn mehrere Skripte laufen.

Soweit ich weiß, kann ich die Klassenmember auch nicht an die static-Funktion direkt übergeben, da Lua-Funktionen nur einen Parameter im Funktionskopf haben dürfen (unzwar lua_State* L; wenn das falsch ist, bitte sofort bescheid sagen und vor allem, wie ich den Parameter bestimme).

Gibt es dann überhaupt eine Möglichkeit an die Membervariable zu kommen?

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

19.12.2008, 13:34

Man könnte sowas mit einer "statischen" Map lösen. Elegant ist aber was anderes. Ansonsten vllt mal das Singleton Entwurfsmuster angucken.

Aber mal am Rande: Warum schreibst du den Lua Wrapper selber? Lerneffekt?

Viktor

Alter Hase

  • »Viktor« ist der Autor dieses Themas

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

3

19.12.2008, 13:50

Ich denke mal, so bin ich am direktesten an Lua dran. Ich hatte es mal mit Luabind probiert, das hatte aber nicht wirklich funktioniert. Wenn ich das richtig sehe, habe ich dort nämlich das gleiche Problem.
Und mit Lua auch ohne Wrapper umgehen zu können schadet mal denke ich nicht (es sei denn es sollte sehr viel einfacher dadurch werden, momentan hat dann doch eher der Fortschritt Vorrang).

Edit:
Wenn ich die Klasse als Singelton ausweise, wird doch nur verhindert, dass das Objekt mehrfach existiert. D.h. dann aber auch wieder, dass Skripte nur nacheinander bearbeitet werden können (?).

4

19.12.2008, 14:11

Du koenntest bei Programmstart eine Umgebungsvariable vom Typ fulluserdata/lightuserdata (z.B. enthaelt einen Zeiger auf deine Lua-Instanz) anlegen und sie beim Aufruf der Funktion in Lua als Parameter uebergeben. Dieser liegt dann auf dem Stack des lua states. Auslesen, casten, Member zugreifen. Fertig. In Game Programming Gems 6 gibt es zwei gute Artikel, die dir die Verwendung von C++ Objekten bzw. der Zugriff darauf naeher bringen.

Werbeanzeige