LuaPlus学习(四)
	
		
		系统
		
		1892 0
	
	  
  
    <--!版权所有foruok,转载注明出处!-->
  
  
     一个完整的例子
  
   试验了一个完整的例子。 在C++中生成一个类,注册到lua。 从lua调用C++类的成员函数。 在Alternate.lua中写了阶乘函数factorial。 从C++中调用factorial。 Alternate.lua如下: 
  
    
      
      
        print(
      
      
        "
      
      
        nowinalternate.lua
      
      
        "
      
      
        ); 
        
        
        print(
      
      
        "
      
      
        initialnumberofAxhSystem:
      
      
        "
      
      
        ..AxhSystem:GetNumber()); 
        
        AxhSystem:SetNumber(
      
      
        15
      
      
        ); 
        
        print(
      
      
        "
      
      
        Changethenumberfromlua,new:
      
      
        "
      
      
        ..AxhSystem:GetNumber()); 
        
        print(
      
      
        "
      
      
        NowSetmessageto'Helloworld'
      
      
        "
      
      
        ); 
        
        AxhSystem:SetMessage(
      
      
        "
      
      
        Helloworld
      
      
        "
      
      
        ); 
        
        print(
      
      
        "
      
      
        AxhSystem:GetMessagereturn:
      
      
        "
      
      
        ..AxhSystem:GetMessage()); 
        
        
        print(
      
      
        "
      
      
         now,enteranumbertochangeAxhSystem'snumber:
      
      
        "
      
      
        ); 
        
        num
      
      
        =
      
      
        io.read(
      
      
        "
      
      
        *number
      
      
        "
      
      
        ); 
        
        print(
      
      
        "
      
      
        youenter:
      
      
        "
      
      
        ..num); 
        
        print(
      
      
        "
      
      
        settoAxhSystem
      
      
        "
      
      
        ) 
        
        AxhSystem:SetNumber(num); 
        
        print(
      
      
        "
      
      
        AxhSystem'snewnumber=
      
      
        "
      
      
        ..AxhSystem:GetNumber()); 
        
        
        functionfactorial(n) 
        
      
      
        if
      
      
        (n
      
      
        ==
      
      
        0
      
      
        )then 
        
      
      
        return
      
      
      
      
        1
      
      
        ; 
        
      
      
        else
      
      
        
      
      
        return
      
      
        n
      
      
        *
      
      
        factorial(n
      
      
        -
      
      
        1
      
      
        ); 
        
        end 
        
        end
      
     
   
   C++代码如下: 
  
    
      
      
        
      
      
        class
      
      
        CAxhSystem 
        
        
      
      
        ...
      
      
        
          { 
          
        
        
          public
        
        
          : 
          
          CAxhSystem():m_nNumber(
        
        
          0
        
        
          ) 
          
          
        
        
          ...
        
        
          
            { 
            
            memset(m_szMsg,
          
          
            0
          
          
            ,
          
          
            sizeof
          
          
            (m_szMsg)); 
            
            }
          
        
        
          
          
        
        
          ~
        
        
          CAxhSystem() 
          
          
        
        
          ...
        
        
          
            { 
            
            
            }
          
        
        
          
          
        
        
          void
        
        
          SetNumber(
        
        
          int
        
        
          num) 
          
          
        
        
          ...
        
        
          
            { 
            
            m_nNumber
          
          
            =
          
          
            num; 
            
            }
          
        
        
          
          
        
        
          int
        
        
          GetNumber() 
          
          
        
        
          ...
        
        
          
            { 
            
          
          
            return
          
          
            m_nNumber; 
            
            }
          
        
        
          
          
        
        
          void
        
        
          SetMessage(
        
        
          const
        
        
        
        
          char
        
        
        
        
          *
        
        
          szMsg) 
          
          
        
        
          ...
        
        
          
            { 
            
          
          
            if
          
          
            (szMsg) 
            
            _tcsncpy(m_szMsg,szMsg,
          
          
            256
          
          
            ); 
            
            }
          
        
        
          
          
        
        
          char
        
        
        
        
          *
        
        
          GetMessage() 
          
          
        
        
          ...
        
        
          
            { 
            
          
          
            return
          
          
            m_szMsg; 
            
            }
          
        
        
          
          
        
        
          protected
        
        
          : 
          
        
        
          int
        
        
          m_nNumber; 
          
        
        
          char
        
        
          m_szMsg[
        
        
          256
        
        
          ]; 
          
          }
        
      
      
        ; 
        
        
        CAxhSystemg_system; 
        
        
        LuaStateOwnerg_state; 
        
        LuaObjectg_globalObj; 
        
        
      
      
        int
      
      
        InitLua() 
        
        
      
      
        ...
      
      
        
          { 
          
          g_state
        
        
          ->
        
        
          OpenLibs(); 
          
          g_globalObj
        
        
          =
        
        
          g_state
        
        
          ->
        
        
          GetGlobals(); 
          
        
        
          return
        
        
        
        
          0
        
        
          ; 
          
          }
        
      
      
        
        
      
      
        int
      
      
        RegisterObject() 
        
        
      
      
        ...
      
      
        
          { 
          
          LuaObjectaxhmetaobj
        
        
          =
        
        
          g_globalObj.CreateTable(
        
        
          "
        
        
          AxhMetaTable
        
        
          "
        
        
          ); 
          
          axhmetaobj.SetObject(
        
        
          "
        
        
          __index
        
        
          "
        
        
          ,axhmetaobj); 
          
          
        
        
          //
        
        
          registerfunctor
        
        
          
        
        
          axhmetaobj.RegisterObjectDirect(
        
        
          "
        
        
          SetNumber
        
        
          "
        
        
          ,(
        
        
          const
        
        
          CAxhSystem
        
        
          *
        
        
          )
        
        
          0
        
        
          ,CAxhSystem::SetNumber); 
          
          axhmetaobj.RegisterObjectDirect(
        
        
          "
        
        
          GetNumber
        
        
          "
        
        
          ,(
        
        
          const
        
        
          CAxhSystem
        
        
          *
        
        
          )
        
        
          0
        
        
          ,CAxhSystem::GetNumber); 
          
          axhmetaobj.RegisterObjectDirect(
        
        
          "
        
        
          SetMessage
        
        
          "
        
        
          ,(
        
        
          const
        
        
          CAxhSystem
        
        
          *
        
        
          )
        
        
          0
        
        
          ,CAxhSystem::SetMessage); 
          
          axhmetaobj.RegisterObjectDirect(
        
        
          "
        
        
          GetMessage
        
        
          "
        
        
          ,(
        
        
          const
        
        
          CAxhSystem
        
        
          *
        
        
          )
        
        
          0
        
        
          ,CAxhSystem::GetMessage); 
          
          
        
        
          //
        
        
          getluaobject
        
        
          
        
        
          LuaObjectluasys
        
        
          =
        
        
          g_state
        
        
          ->
        
        
          BoxPointer(
        
        
          &
        
        
          g_system); 
          
          luasys.SetMetaTable(axhmetaobj); 
          
          g_globalObj.SetObject(
        
        
          "
        
        
          AxhSystem
        
        
          "
        
        
          ,luasys); 
          
          
        
        
          return
        
        
        
        
          0
        
        
          ; 
          
          
          }
        
      
      
        
        
        
      
      
        int
      
      
        _tmain(
      
      
        int
      
      
        argc,_TCHAR
      
      
        *
      
      
        argv[]) 
        
        
      
      
        ...
      
      
        
          { 
          
          InitLua(); 
          
          RegisterObject(); 
          
          
          g_state
        
        
          ->
        
        
          DoFile(
        
        
          "
        
        
          Alternate.lua
        
        
          "
        
        
          ); 
          
          
          LuaFunction
        
        
          <
        
        
          int
        
        
          >
        
        
          factorial
        
        
          =
        
        
          g_state
        
        
          ->
        
        
          GetGlobal(
        
        
          "
        
        
          factorial
        
        
          "
        
        
          ); 
          
          printf(
        
        
          "
        
        
           Nowcall'factoral'inAlternate.lua,enteranumber:
        
        
          "
        
        
          ); 
          
        
        
          int
        
        
          number; 
          
          scanf(
        
        
          "
        
        
          %d
        
        
          "
        
        
          ,
        
        
          &
        
        
          number); 
          
          printf(
        
        
          "
        
        
          Youennter%d,it'sfactorial=%d 
        
        
          "
        
        
          ,number,factorial(number)); 
          
          
        
        
          return
        
        
        
        
          0
        
        
          ; 
          
          }
        
      
     
   
   OK,到这里已经可以在lua和c++之间做一些交互了,可以根据需要实现我们的目标了。 接下来我要好好学习lua了,不然没办法用它来写复杂的逻辑。 <--!版权所有foruok,转载注明出处!-->
                
  
    
      LuaPlus学习(四)
    
  
 
 
 	
	
	
	
	
			
	
		
			
				
					更多文章、技术交流、商务合作、联系博主
					
						微信扫码或搜索:z360901061
					
					
					
						微信扫一扫加我为好友
						
							QQ号联系:  360901061
						
					 
				 
			 
		 
	 
	
		
			
				
					您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
					
						【本文对您有帮助就好】元