2010-05-19 9 views
0

Je concrétise une question que j'avais plus tôt.SWIG-Lua question sur la classe retournant une autre classe

J'ai deux classes en C++ et j'utilise SWIG pour les envelopper. Une méthode dans une classe peut renvoyer un pointeur vers l'autre classe. Comment puis-je faire en sorte que Lua ne soit pas seulement une userdata?

Plus concrètement:

Je

class fruit 
{ 
    int numberofseeds; 
    //some other stuff about fruit constructors etc... 
    public: 
    getseedcount() 
    { 
     return numberofseeds; 
    } 
} 

class tree 
{ 
    fruit * apple; 
    public: 
     //constructors and whatnot 
    fruit * getfruit() 
    { 
     return apple; 
    } 

} 

J'enveloppe ces deux classes avec SWIG pour que je puisse y accéder à Lua

Je peux obtenir en Lua l'objet x = pomona .tree (grannysmith).

Ma question est maintenant: Comment puis-je organiser des choses de sorte que lorsque je tape y = x: getfruit() je vais obtenir un Pomone: objet de type fruits? Où puis-je écrire quelque chose ligne y: getseedcount()? En ce moment tout ce que je reçois est userdata qui n'est pas comestible.

Répondre

1

Si votre SWIG .I fichier est correctement configuré, vous pouvez utiliser la fonction ":" opérateur:

local y = x:getfruit() 
local z = y:getseedcount() 

Voir la section "Classes" (23.2.7) du SWIG Lua documentation.

Si cela ne fonctionne pas, vous devez indiquer à SWIG comment convertir un paramètre fruit * out en une représentation Lua en utilisant une typemap dans votre fichier .i. Quelque chose comme:

%typemap(out) fruit* 
{ 
    swig_module_info* module = SWIG_GetModule(L); 
    swig_type_info* typeInfo = SWIG_TypeQueryModule(module, module, "fruit *"); 

    SWIG_NewPointerObj(L, $1, typeInfo, 1); 
} 
Questions connexes