首页 > 代码库 > JavaScrip代码转C++代码的一些方法

JavaScrip代码转C++代码的一些方法

一: 关于公有成员,私有成员,公有方法,私有方法

     1): 公有成员:

       就目前了解来看,在JS中形如this.XXX, 或者在defineProperties() 域中定义的成员变量,都是公有的。

     2): 私有成员:

       就目前了解来看,在JS中形如 this._XXX 都是私有的, 当然往往有私有成员在defineProperties()域中被转成了公有成员:

例:  

技术分享
 

3): 私有方法:

   就目前了解来看, 在JS中形如 function XXX() 都是私有的, 只在本类使用。

        例: 技术分享

 

 

4): 公有方法 而形如 this.XXX 或者 类.prototype.XXX() 就是公有方法。

例:技术分享

二: 关于get, set 方法的使用

     对某一成员变量来说,如果JS中有set方法, 那么需要加get,get方法。 而如果没有set并且这个成员变量可以做成公有的, 就不必加get,set了。

 

 

三: 关于构造函数中的Options

1):Options 简单的,Options域中的成员完全可以作为构造函数参数;

     例:

       技术分享

     

     C++中可以这样处理:

     技术分享

 

 

2): Options 复杂的,把Options单独声明成类或者结构体,再把这个结构当做构造函数参数。

   例:

    技术分享

 

  C++中可以做成这样:RenderStateOption 定义为一个类结构

 技术分享

 

     3):构造函数中的默认参数值, 成员函数中的默认参数值,在JS中常常看到这样的情况defaultValue(XXX, XXX), 或者在JS的注释中标明了defaultvalue, 这两种情况都要在构造函数中,或者成员函数中,增加默认值。  

 

 

 

四: 关于JS中代表多种类型TypeArray,Value:

     在JS中是弱类型的, 一个Value可以表述为int, float, double等。一个TypeArray也可能代表不同类型, 这种情况分两种情况处理。

     1):用模板处理,例:buffer.js 中arrayView 可以是不同类型  

      技术分享

     在C++中用模板处理:

技术分享
 

     2): 用面向对象的继承处理,基类指针指向子类实例: 例:ShaderProgram.js 中Uniform

技术分享
 

  在C++中这样处理的:

技术分享
 

五: 关于JS中函数指针

JS中经常会定义函数指针,或者会类附加一个函数,这个分两种情况对待:

1):函数指针仅在类内部使用,且没有被存储(存储看RenderState的情况),而是在后面函数中马上会被用到,这种情况在C++中没有必要做成函数指针。  例:在VertexArray.js中,在addAttribute函数中为attr对象增加一个函数指针,而这个函数指针在后面bind调用。

 

     技术分享
技术分享
 

在C++中这样处理的:

  技术分享
技术分享
 

2): 函数指针被保存,供后续回调使用时, 这种情况C++须按函数指针处理。 例:JS中AutomaticUniform中的getValue要在ShaderProgram中回调

技术分享
 

那么在C++中就要做成函数指针,然后做好后续回调工作。

技术分享
 

六: 关于JS中的继承和多态

JS中继承关系是不明显的, 而C++采用继承和多态会显著提高编码效率,重用率,一个良好的类框架设计,有助于后续版本维护升级。

例:JS中Texture,CubeMapFrace, CubeMap 就有明显的继承关系。 对于功能相同的代码可以在子类的复用或重载。

技术分享
 
技术分享
 
技术分享
 

七: 关于JS中的destroy, isDestroyed

    就目前理解来看,这两个方法,是JS释放对象的, 如果一个对象释放了isDestroyed就会返回true。

C++由可以实现destroy方法,但已经有析构函数,并且析构函数会自动调用基类的析构函数。 如果再做一个Destroy方法就是好像画蛇添足。 并且destroy方法, isDestroyed方法都需要实现,如果有继承关系的情况,还需要考虑子类需要重载destroy方法。

 

 

八: 关于C++中指针使用(指向类或结构的指针)      

     第一种情况:在类内声明指针,一个成员变量是否声明为指针,只有一条原则:“类是否负责创建和销毁该成员变量”。

     1): 该类负责该成员的生命周期, 那么这个成员变量可以声明成非指针,也可以声明成指针。

 

     2):该类不负责成员的创建和释放,这种情况还是把成员声明成指针比较好。

     

第二种情况: 在函数内使用指针, 局部变量的创建不建议使用指针,尽量在栈上创建的形式, 或使用引用。

 

第三种情况: 在容器中使用,建议在容器中存放指针(简单类型或结构除外),而不是对象本身;

理由1:首先这种容器包括容器里的对象指针,声明周期都有具体的类负责,

理由2:避免了容器拷贝时,容器里面对象的拷贝操作;

理由3:容器往往动态增长,避免占用较大内存。

 

九: 关于重载操作符

在Core有大量的工具类,比如向量操作,矩阵操作等,这些工具类使用频繁,如果重载了操作符:

技术分享
 
    技术分享

 

 

 

 

     

     

     

         

 

  

JavaScrip代码转C++代码的一些方法