|
本帖最后由 609177738 于 2021-10-5 13:50 编辑
首先向涛哥反抗一波,没有研究精神还敲什么代码!!! 具体看图片 ,不至于被删帖吧
本文方法涛哥不是很认可!!!
各位封装用户应该都知道,火山PC调用外部库时,当函数参数为结构体(struct类型)时非常麻烦
官方提供的结构体基础类啥的 ,恕我直言,花里胡哨的,瞅了一眼,没看懂,也没仔细看,也不想看了...
---------------------------------------------------------------------------
各位封装用户大多是都是采用 嵌入类成员变量 来操作的
简单点的结构体还好说 ,比如RECT 也就4个成员 写四个属性读 四个属性写 就解决了
但是!!! 当结构体复杂时,尤其是嵌套结构体 ,难不成 每一种 组合类型的结构体 都要重新写一遍???
因此本文就是解决这个问题的!
因此本文就是解决这个问题的!
因此本文就是解决这个问题的!
-------------------------------------------
不想看过程的可以直接看代码区 或 直接下载附件
-------------------------------------------
懂C++的应该知道结构体也是一种类,特殊的类,不懂得百度
那为什么火山的类强制转换结构体不能用呢?
问题在于 火山默认所有的类都会继承CVolObject 也就是 对象类 ,这个类里有成员变量 用于各种类和数据类型判断是否为空对象等
经过我的不懈研究,发现 @外部基础类 会使所在类不会继承 CVolObject ,但是翻译的时候还会自动在类里面添加 一行宏,
当火山的类 没有类成员时 为 DECLARE_EMPTY_VOL_CLASS 有成员则为 DECLARE_VOL_CLASS
不去掉会报错,这个翻译的过程我办法取消,不让它生成 但是 既然是宏 就可以#undef !!!! 意思是取消宏
通过@视窗.前缀文本 可以在class前面加 #undef 但是取消宏 还是会导致下面宏未定义 ,所以紧接着用#define 把这个宏定义为空
总结 @视窗.前缀文本 的内容如下,注意 最后的/**/ 不能省略 不然 翻译的时候不会换行
- #undef DECLARE_VOL_CLASS
- #define DECLARE_VOL_CLASS(name_space, class_name)
- #undef DECLARE_EMPTY_VOL_CLASS
- #define DECLARE_EMPTY_VOL_CLASS(name_space, class_name)
- /**/
复制代码
如果仅仅是这样 还会导致 本类缺少函数定义和其他正常类报错,所以还需要恢复这个宏 并补上本类的函数定义 ,在类下添加以下内容
- @begin
- <include>
- #undef DECLARE_VOL_CLASS
- #define DECLARE_VOL_CLASS(name_space, class_name) \
- DECLARE_VOL_CLASS_NOT_OVR_COMP (name_space, class_name) \
- _DECLARE_VOL_CLASS_COMPARE_OPERATOR (class_name)
- #undef DECLARE_EMPTY_VOL_CLASS
- #define DECLARE_EMPTY_VOL_CLASS(name_space, class_name) \
- DECLARE_EMPTY_VOL_CLASS_NOT_OVR_COMP (name_space, class_name) \
- _DECLARE_VOL_CLASS_COMPARE_OPERATOR (class_name)
- BOOL @sn<current_class>::_IsSelfEqual (const @sn<current_class>& objCompare) const;
- void @sn<current_class>:: _CopySelfFrom (const @sn<current_class>& objCopyFrom);
- public:
- inline_ BOOL operator== (const @sn<current_class>& objCompare) const { return (this == &objCompare); }
- inline_ BOOL operator!= (const @sn<current_class>& objCompare) const { return (this != &objCompare); }
- inline_ void LoadFromStream (CVolBaseInputStream& stream){}
- inline_ void SaveIntoStream (CVolBaseOutputStream& stream){}
- </include>
- @end
复制代码
以RECT为例
你可以选择直接使用 @外部基础类 "RECT" 然后写4个属性读 4个属性写的函数 来给left ,top,right,bottom赋值
如果不想直接继承,关键@外部基础类 还不能空着 咋办??? 写一个头文件 或者去系统文件里 写一个空类
案例给的是
那么就填写@外部基础类 "emptybass " 即可 此步骤非常重要
如此就完成了,纯粹的类,没有杂质的类,没有额外类成员的类!!!
下面你就可以实现嵌套结构类,而不用像之前那么不断从头写了
直接在火山类成员类型使用你写好的类就行 具体的可以参考案例
最后再说下 嵌入调用的传递问题
类直接强转结构体是行不通的 需要通过指针中转下
例如 火山函数 的参数 为 rect RECT类 // RECT类是火山的类执行以上操作
c++函数为 void test_rect(RECT rc)
嵌入写法是
@ test_rect (*(RECT*)&@<rect> );
-----------------------------------------------------------------------
最后再说下可能出现的问题
伴随着版本更新,本文解决方案可能会出现新的报错!!!
我白天给涛哥发的 是今天 2021年9月30日新版本更新之前的 案例 正常使用
然后今天下午更新了,涛哥又是晚上才接收的案例,然后就报错了 ,然后就说了如图的那句话!!!
然后我就不服气的 继续研究了 特此发文
不敢保证以后的版本 涛哥又会往里面加什么内容 ,也不敢保证能不能继续解决
但是 至少目前的版本应该能用很长时间
最后附上案例
----
更新 案例二
[结构体]火山PC传递(嵌套)结构体的方案二
|
|