IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Exposer classe C++ dans Lua


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Par défaut Exposer classe C++ dans Lua
    Plop,

    Cela fait bientôt quelques heures que je m'arrache les cheveux à la recherche d'informations sur comment exposer une instance de classe c++ dans une script lua et pas moyen de trouver.
    Je sais comment exposer une fonction statique, permettre au script Lua de construire une class c++ mais pas ce que je veux.

    Ce que j'aimerais faire exactement c'est accèder une instance de LuaClass de façon globale depuis le script lua.
    Le but c'est d'avoir quelque chose dans le genre bien que je ne soit pas sur de la syntaxe.

    Merci d'avance,
    Je rajoute quand même mon code au cas ou.

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # include "LuaScript.hpp"
    # include "LuaClass.hpp"
     
    int	main(int ac, char **av)
    {
      (void)ac;
      (void)av;
      LuaScript   Test;
      LuaClass    Plop("Debug");
     
      Test.loadFile("files/test.lua");
      Test.call();
      return 0;
    }
    LuaScript.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    #include "LuaScript.hpp"
     
    LuaScript::LuaScript()
    {
      _state = luaL_newstate();
      luaL_openlibs(_state);
    }
     
    LuaScript::~LuaScript()
    {
    }
     
    bool LuaScript::loadFile(std::string param)
    {
      if (luaL_loadfile(_state, param.c_str()) != LUA_OK)
      {
        LuaError();
        return false;
      } else
        return true;
    }
     
    void LuaScript::call()
    {
      if (lua_pcall(_state, 0, LUA_MULTRET, 0) != LUA_OK)
        LuaError();
    }
     
    void LuaScript::LuaError() const
    {
      const char *message = lua_tostring(_state, -1);
      std::cout << message << std::endl;
      lua_pop(_state, 1);
    }
    LuaScript.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #ifndef LUA_LOADER_LUASCRIPT_HPP
    #define LUA_LOADER_LUASCRIPT_HPP
     
    # include       <lua5.2/lua.hpp>
    # include       <string>
    # include       <iostream>
     
    class LuaScript
    {
    private:
      lua_State *_state;
     
    public:
      LuaScript();
     
      ~LuaScript();
     
      bool loadFile(std::string);
     
      void  call();
     
      void LuaError() const;
     
    };
     
    #endif //LUA_LOADER_LUASCRIPT_HPP
    LuaClass.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "LuaClass.hpp"
     
    LuaClass::LuaClass(std::string value)
    {
      _value = value;
    }
     
    LuaClass::~LuaClass()
    {
    }
     
    void LuaClass::debug() const
    {
      std::cout << "Test : " << _value << std::endl;
    }
    LuaClass.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef LUA_LOADER_LUACLASS_HPP
    #define LUA_LOADER_LUACLASS_HPP
     
    # include   <iostream>
     
    class LuaClass
    {
    private:
      std::string _value;
    public:
      LuaClass(std::string);
     
      ~LuaClass();
     
      void debug() const;
    };
     
    #endif //LUA_LOADER_LUACLASS_HPP

  2. #2
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Salut

    À mon avis, il vaut mieux utiliser un binding comme https://github.com/ahupowerdns/luawrapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     // main.cpp
    #include <LuaContext.hpp>
    #include <fstream>
    #include <iostream>
     
    struct Hello {
        void sayHello() { std::cout << "Hello from C++\n"; } 
    };
     
    int main() {
        LuaContext lua;
        lua.registerFunction("sayHello", &Hello::sayHello);
     
        Hello myHello;
        lua.writeVariable("myHello", &myHello);  // exporte l'instance
        std::ifstream ifs("script.lua");
        lua.executeCode(ifs);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     -- script.lua
    io.write(string.format("Hello from lua\n"))
    myHello:sayHello()

  3. #3
    Membre actif Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Par défaut
    Merci ça marche parfaitement !

    Du coup voilà la fin du projet si jamais ça tente quelqu'un d'y jeter un coup d'oeil :
    C'est pas le truc le plus propre du monde mais ça marche ^^

    LuaScript.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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_LOADER_LUASCRIPT_HPP
    #define LUA_LOADER_LUASCRIPT_HPP
     
    # include       <LuaClass.hpp>
    # include       <string>
    # include       <iostream>
    # include       <fstream>
     
    class LuaScript
    {
    private:
      LuaContext lua;
      std::ifstream ifs;
     
    public:
      LuaScript();
     
      ~LuaScript();
     
      bool loadFile(std::string);
     
      void call();
     
      template<typename T>
      void registerClass(ILuaClass *param, std::string name)
      {
        param->registerFunction(lua);
        lua.writeVariable(name, *(static_cast<T*>(param)));
      }
     
    };
     
    #endif //LUA_LOADER_LUASCRIPT_HPP
    LuaScript.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include "LuaScript.hpp"
     
    LuaScript::LuaScript()
    {
    }
     
    LuaScript::~LuaScript()
    {
    }
     
    bool LuaScript::loadFile(std::string param)
    {
      ifs.open(param.c_str());
      return ifs.is_open();
    }
     
    void LuaScript::call()
    {
      lua.executeCode(ifs);
    }
    LuaClass.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #ifndef LUA_LOADER_LUACLASS_HPP
    #define LUA_LOADER_LUACLASS_HPP
     
    # include   <iostream>
    # include   <LuaContext.hpp>
     
    class ILuaClass
    {
    public:
      virtual ~ILuaClass() {};
     
      virtual void  registerFunction(LuaContext&) = 0;
    };
     
    class LuaClass : public ILuaClass
    {
    private:
      std::string _value;
    public:
      LuaClass(std::string);
     
      ~LuaClass();
     
      void debug() const;
     
      virtual void  registerFunction(LuaContext&);
    };
     
    #endif //LUA_LOADER_LUACLASS_HPP
    LuaClass.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include "LuaClass.hpp"
     
    LuaClass::LuaClass(std::string value)
    {
      _value = value;
    }
     
    LuaClass::~LuaClass()
    {
    }
     
    void LuaClass::debug() const
    {
      std::cout << "Test : " << _value << std::endl;
    }
     
    void LuaClass::registerFunction(LuaContext &lua)
    {
      lua.registerFunction("debug", &LuaClass::debug);
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # include "LuaScript.hpp"
     
    int main(int ac, char **av)
    {
      (void) ac;
      (void) av;
      LuaScript   Test;
      LuaClass Plop("test");
     
      Test.loadFile("files/test.lua");
      Test.registerClass<LuaClass>(&Plop, "Plop");
      Test.call();
      return 0;
    }
    test.lua
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    io.write(string.format("Hello from lua\n"))
    Plop:debug()

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Juste quelques petites remarques, pour te permettre de l'améliorer encore :
    • Depuis C++11, les fichiers acceptent aussi les std::string... y a plus besoin de demander une chaine C style avec c_str()
    • Les chaines de caractères sont décidément géniales, mais la copie est un processus qui prend énormément de temps... Afin d'éviter les copies inutiles, tu devrais les transmettre sous la forme d'une référence (éventuellment constante si la fonction appelée n'est pas destinée à la modifier)
    • Plustôt que d'ouvrir un fichier dans une fonction, puis de le garder ouvert jusqu'à la fin (ce qui peut poser certains problèmes), sauvegarde peut être plutot le non de fichier (en faisant au besoin un test pour t'assurer qu'il s'ouvre), et ouvre le dans la (ou les) fonction(s) qui l'utilisent
    • la fonction loadFile ne fait pas ce qu'elle prétend ; tu ferais bien de la renommer en quelque chose d'autre, qui indiquerait clairement que le but est de vérifier l'accessibilité du fichier
    • Ta class LuaScript fini par avoir quatre responsabilités distinctes:
      1. tester l'accessibilité du fichier
      2. garder le fichier ouvert
      3. enregistrer les infos dans le fichier
      4. appeler l'exécution du script

      Ca fait au moins trois responsabilités de trop, en vertu du SRP
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2009, 01h43
  2. Réponses: 6
    Dernier message: 23/09/2005, 12h54
  3. [Language] Explications classe définie dans une classe
    Par etiennegaloup dans le forum Langage
    Réponses: 6
    Dernier message: 13/09/2005, 22h15
  4. [JAR]Class-Path dans le fichier Manifest
    Par Kleb dans le forum Général Java
    Réponses: 5
    Dernier message: 08/01/2005, 08h51
  5. [GEF]class Figure dans container SWING ?
    Par Albarad dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/06/2004, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo