仙五前修改吧 关注:145贴子:14,795
  • 17回复贴,共1

【求问】关于主程序里各类的结构

只看楼主收藏回复

这个问题我想过一些。
C++的类有成员函数和成员变量。很明显从开放给lua的函数里看到,是通过调用类内的成员函数来修改成员变量的。【我忘了lua是全部都是call一个C++函数的地址还是有时候也有部分代码在lua的定义里,手头没有游戏没法看】
因为C++没有反射机制,因此许多函数反编译了就剩下sub_什么什么东西,要自己推测用法含义。成员变量也显示不出名字(但是因为各种修改器的存在,它们的作者早已摸清楚这些参数的地址,从而可以推测出名字)。
不过我的问题主要是关于类的static变量与函数的问题。
我们知道在主菜单调用止血草的脚步会出错,就是因为调用了getplayerHP,而这个时候没有初始化。
那么问题来了,player这个类究竟完全是实例类还是有静态的函数/成员变量?它是怎么解决每个角色的数据问题的?是给每个角色分了一个类的实例还是一个类实例化的时候,所有人的数据都在里面,只是有些没有用到?
该类是否存在一些我们目前完全不清楚作用的函数/成员变量?
@风靡义磊


回复
1楼2019-11-19 14:30
    lua里面没有类,player只是作为前缀,加长函数名,不对应c++里的东西


    收起回复
    来自Android客户端2楼2019-11-20 17:51
      Q: player这个类究竟完全是实例类还是有静态的函数/成员变量?
      A: 可以有静态的,不知道有没有,但这个不是很重要吧?


      Q: 它是怎么解决每个角色的数据问题的?是给每个角色分了一个类的实例还是一个类实例化的时候,所有人的数据都在里面,只是有些没有用到?
      A: 就是普通的面向对象编程啊,把共同点抽象出来写变量和函数,当然某个实例也可以有变量未赋值,对应C++的情况这个变量就是一个乱码值。


      Q: player.GetHP的机制
      A: 首先在主程序里面已经有player.GetHP对应的函数,这个函数是全局的,不是类成员函数。函数读取lua传入的参数,其中就有id,然后根据id找到player类中对应的实例,调用实例的GetHP函数,再把返回值传给lua。


      收起回复
      3楼2019-11-20 20:01
        第一个问题:
        虽然我并没有学过C++编译时候的一套规则,但是觉得类的静态变量和函数编译出来只是程序里面的一个地址,因此反编译的时候是不能确定类的归属的,对吗?
        这里还有一个问题就是C++到底说“静态”和“全局”有没有区别。


        综合(2)和(3):
        那么我构思一下player类的变量和函数的结构:
        //静态变量段

        //静态变量段end。
        //成员变量段
        playerHP一类的
        //成员变量段end
        //静态函数段:
        包含Player.GetHP(id)。
        Player.SetHP(id,num).
        等等
        //成员函数段
        例如各个成员的getHP
        //
        因为C++没有反射机制,所以要调用某个player实例的getHP函数必须通过如下机制:想要拿到它的指针,就必须在静态变量段有个登记表,每次实例化都要登记一下,需要的时候查表就可以得到。
        但是,我们知道id是2的幂次,这暗示着是个掩码。可能是用于全员加血一类的事情。通过掩码对应player[0],player[1]或者说它们的登记表或者说它们的指针,这真是个想不明白的事情。


        收起回复
        4楼2019-11-21 02:04
          因此反编译的时候是不能确定类的归属的,对吗?
          什么叫类的归属。


          “静态”和“全局”有没有区别?
          可以认为没有区别,都是程序运行时就会初始化的变量,不需要实例。在实例中只会记录静态变量的全局地址,不会复制内容,实例需要的时候直接去全局找就行了,假如一个对象改了静态成员的值,另一个对象会拿到新的值而不是原来的。


          player.GetHP(id,flag,num)这种函数其实应该是没有放到类里面作为静态函数,因为我发现所有的lua交互函数都是放在一块的,应该是一起定义的。但既然不是成员函数,不管放到哪里都没啥实质影响,最多就是语法上的一点区别而已。


          收起回复
          5楼2019-11-21 11:27