2012-05-29 3 views
0

Je veux faire quelque chose comme ceci:
1. Créer un objet dans Lua
2. Obtenez cet objet
C++ 3. Effectuez une méthode sur cet objet, il passe de
Travailler avec lua objets en C++

C++

maintenant, j'ai ce Lua:

Account = {balance = 0} 

function Account.Create(name) 
    local a = Account:new(nil, name); 
    return a; 
end 

function Account:new (o, name) 
    o = o or {name=name} 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

function Account:Info() 
    return self.name; 
end 

code en C++

//get Lua object 

lua_getglobal (L, "Account"); 
lua_pushstring(L, "Create"); 
lua_gettable(L, -2); 
lua_pushstring(L, "SomeName"); 
lua_pcall(L, 1, 1, 0); 
const void* pointer = lua_topointer(L, -1); 
lua_pop(L, 3); 

//then I want to perform some method on object 

lua_getglobal (L, "Account"); 
lua_pushstring(L, "Info"); 
lua_gettable(L, -2); 
lua_pushlightuserdata(L,(void*) pointer); 
lua_pcall(L, 0, 1, 0); 
//NOW I GET "attempt to index local 'self' (a userdata value)' 
const char* str = lua_tostring(L, -1); 
...etc... 

Avez-vous ce que j'ai mal fait? Comment puis-je obtenir cet objet Lua en C++?

Répondre

2
const void* pointer = lua_topointer(L, -1); 

Les tables Lua ne sont pas des objets C. Ils ne sont pas void* s. Le lua_topointer documentation dit que la fonction est principalement à des fins de débogage. Vous ne déboguez rien.

Les tables Lua sont uniquement accessibles via l'API Lua. Vous ne pouvez pas simplement obtenir un pointeur vers une table Lua ou quelque chose. Au lieu de cela, ce que vous devez faire est de stocker la table Lua dans un endroit, et ensuite le récupérer à partir de cet endroit quand vous voulez y accéder. L'endroit typique pour stocker ce genre de données est le registre de Lua. C'est inaccessible depuis le code Lua; seul le C-API peut lui parler.

Généralement, vous avez une table stockée dans le registre qui contient toutes les valeurs Lua que vous détenez actuellement. De cette façon, votre utilisation du registre ne va pas empêcher l'utilisation de quelqu'un d'autre.