所以我有一个c++类的集合,我现在已经很好地将炼金术转换为swc文件,并且可以从我的AS3代码中调用暴露的函数。
我真正想做的是重建像Box2D的b2Vec这样的东西。类,
public class b2Vec2 extends b2Base {
public function b2Vec2(p:int) {
_ptr = p;
}
public function get v2():V2 {
return new V2(x, y);
}
public function set v2(v:V2):void {
x = v.x;
y = v.y;
}
public function get x():Number { return mem._mrf(_ptr + 0); }
public function set x(v:Number):void { mem._mwf(_ptr + 0, v); }
public function get y():Number { return mem._mrf(_ptr + 4); }
public function set y(v:Number):void { mem._mwf(_ptr + 4, v); }
}
这是一个简单的例子,但显示了我想要做的事情。在C语言方面,b2Vec2是一个结构体,
/// A 2D column vector.
struct b2Vec2
{
/// Default constructor does nothing (for performance).
b2Vec2() {}
....
float32 x, y;
};
因此,对于这个结构体,很容易计算出b2Vec2对象的第一个变量是浮点数,它将是x中的值,可以通过Alchemy的MemUser类_mrf(从内存中的点读取浮点数)用_mrf(pointerAddress)读取,你可以用_mrf(pointerAddress + 4)读取第二个浮点数。
我的问题是,如果你不是一个c++专家(我),有什么方法可以得到一个类的定义,如在所有变量的地址和他们是什么?所以,对于b2Vec2,我想象它是这样的,Float32 x 0Float34 y 4…
我问这个问题的原因是因为其中一个类特别有很多变量,并且要尝试获取每个变量的信息,以便我可以直接从AS3代码访问它,这将是大量的工作,我将假设我将引入大量的人为错误。
一般的c++答案是否定的。在运行时,您无法发现特定结构体的成员变量是什么。
如何在c++应用程序中添加反射?
我不知道炼金术编译代码看起来像什么。您可以构建一些工具/预处理器来从其他表示生成c++类或结构,然后该工具也可以生成您的AS3访问器-这将是消除用户错误和一些工作的一种方式。这可能很棘手,因为计算成员变量的地址并不总是那么简单。
如果你可以在c++类中调用成员函数,为什么不把get/set函数移到那里并调用它们呢?
我从WCK的Jesse Sternberg那里得到了一个足够好的答案。他让他的大多数AS3类与c++类配对,在构建过程中自动在他自己的"探针"文件夹中完成。在这里,有一个box2dc类,它在顶部定义了一组模板,然后在main函数中,探测类的成员变量,并打印出从该端访问它们的相关AS3代码。
这是有点古怪的习惯,但肯定非常方便,比手动做得好得多!