|
继上一篇 【结构体】解决火山PC传递(嵌套)结构体的优化方案 被官方所嫌弃 抽空看了下官方的 @视窗.结构类 0 的问题
发现问题所在 实际上官方的结构体是可以实现的 不过不知道为什么 写了一半就没了....也许另有高招 ???
实际就差一行代码就可以实现了 至于官方改进我也没抱什么希望 民间流传着一句话 你尽管提,改了算我输
当然要真改起来并不是那么简单,这我就不关心了,我只教用户现阶段怎么使用
下面开始分析 手写一个 RECT 一个 SIZE 一个自定义嵌套类
类名 | 基础类 | 公开 | 属性名 | 属性值 | 备注 | RECT类 | | √ | @视窗.结构类 | 0 | |
成员变量名 | 类型 | 公开 | 静态 | 参考 | 初始值 | 属性名 | 属性值 | 备注 | left | 整数 | √ | | | | | | | top | 整数 | √ | | | | | | | right | 整数 | √ | | | | | | | bottom | 整数 | √ | | | | | | | --------------------------------------------------------------------------
类名 | 基础类 | 公开 | 属性名 | 属性值 | 备注 | SIZE类 | | √ | @视窗.结构类 | 0 | |
成员变量名 | 类型 | 公开 | 静态 | 参考 | 初始值 | 属性名 | 属性值 | 备注 | x | 整数 | √ | | | | | | | y | 整数 | √ | | | | | | | ---------------------------------------------------------------------------
类名 | 基础类 | 公开 | 属性名 | 属性值 | 备注 | 结构体嵌套类 | | √ | @视窗.结构类 | 0 | |
成员变量名 | 类型 | 公开 | 静态 | 参考 | 初始值 | 属性名 | 属性值 | 备注 | i | 整数 | √ | | | | | | | rc | RECT类 | √ | | | | | | | si | SIZE类 | √ | | | | | | |
随便写个程序 写个 结构体嵌套类 的对象 赋值 调试下(无加密狗) 在我这里输出的对应文件名如下
结构体嵌套类 对应 vcls_rg_jgtktl.h
RECT类 对应 vcls_rg_RECTl.h
SIZE类 对应 vcls_rg_SIZEl.h
-------------------
我们以 RECT类 为例 文件内容如下
- // Generated by Volcano Development Platform - http://www.voldp.com
- #ifndef __VCLS_RG_HSH_JG_RG_RECTL_H__
- #define __VCLS_RG_HSH_JG_RG_RECTL_H__
- namespace rg_hsh_jg
- {
- class rg_RECTl : public CVolObject
- {
- DECLARE_VOL_CLASS (rg_hsh_jg, rg_RECTl)
- public:
- rg_RECTl ();
- virtual void LoadFromStream (CVolBaseInputStream& stream) override;
- virtual void SaveIntoStream (CVolBaseOutputStream& stream) override;
- public:
- INT rg_n2;
- INT rg_n3;
- INT rg_n4;
- INT rg_n5;
- public:
- <font color="red"><strong> struct S
- {
- INT rg_n2;
- INT rg_n3;
- INT rg_n4;
- INT rg_n5;
- };</strong></font>
- <font color="magenta"><strong> S* GetStruct (S* pInf);</strong></font>
- void SetStruct (const S* pInf);
- };
- }
- #endif //__VCLS_RG_HSH_JG_RG_RECTL_H__
复制代码
在对应的cpp例 查看到了 GetStruct 函数
- rg_RECTl::S* rg_RECTl::GetStruct (rg_RECTl::S* pInf)
- {
- pInf->rg_n2 = rg_n2;
- pInf->rg_n3 = rg_n3;
- pInf->rg_n4 = rg_n4;
- pInf->rg_n5 = rg_n5;
- return pInf;
- }
复制代码
这个函数 实现了 从火山的类 成员 给结构体赋值
但是!!! 问题在于 这个类里面并没有这个结构体S的对象 !!!
并且 结构体S 是自动在类里面生成的 结构体声明, 用户想自己通过 类嵌入行代码 添加结构体S对象 实测是行不通的
因为 用户添加的嵌入代码永远是在 结构体S声明的上面 是识别不了的
---------------------------------------
那么官方的结构体类没有提供这个S的对象 怎么办呢 我采用的方法是 写个普通类来继承结构体类
以上面的自定义结构体为例 即 你要使用的最终结构体(不论是基础的 还是嵌套的)
类名 | 基础类 | 公开 | 属性名 | 属性值 | 备注 | 结构体实现类 | 结构体嵌套类 | √ | | | | @begin
<include>
public:
@sn<base_class>::S s; ////// 这里也可以省略@sn<base_class>:: 写这个是告诉你这个基类的嵌套的结构体S
</include>
@end
方法名 | 公开 | 类别 | 静态 | 属性名 | 属性值 | 备注 | 取结构体指针 | √ | 通常 | | @禁止流程检查 | 真 | | 返回值类型 | 变整数 | | | 返回值备注 | | | @ return (INT_P)@sn<base_class>::GetStruct(&(this->s)); ////这里也可以省略@sn<base_class>:: 表明是基类的函数
测试用 c++函数
- struct mystruct {
- int i;
- RECT rc;
- SIZE si;
- };
- static void test_mystruct(mystruct cs);
复制代码
火山调用c++测试函数
方法名 | 公开 | 类别 | 静态 | 属性名 | 属性值 | 备注 | 测试RECT_火山结构类 | √ | | √ | | | | 返回值类型 | | | | 返回值备注 | | | 参数名 | 类型 | | | 属性名 | 属性值 | | rect | 变整数 | | | | | | @ test_mystruct(*(mystruct*)@<rect>);
-----------------------------------------------------------------------------------------------------------
用的时候就可以 直接声明一个 结构体实现类 的对象 以局部变量为例
局部变量名 | 类型 | 静态 | 参考 | 初始值 | 属性名 | 属性值 | 备注 | 结构实现 | 结构体实现类 | | | | | | |
结构实现.i = 573
结构实现.rc.left = 321
结构实现.rc.top = 654
结构实现.rc.right = 789
结构实现.rc.bottom = 963
结构实现.si.x = 10
结构实现.si.y = 21
测试RECT_火山结构类 (结构实现.取结构体指针 ())
---------------------------------
c++函数输出mystruct结构内容: , 573, 321, 654, 789, 963, 10, 21
里面还有一个 void SetStruct (const S* pInf); 具体的按你们自己的需求自己写方法吧
个人感觉这个方法也同样简单些 你们认为呢 小白也可以使用 那几行嵌入行直接复制粘贴就行了
不管怎样一定要注意 S 的使用 就目前我观察结果 所有的结构体在对应类中的 结构体声明都是S
直接复制粘贴 也要注意嵌入的 S 对象名 在大环境下 如果有交集 要注意能否区分开来的问题
最后附上案例
|
|