[结构体]火山PC传递(嵌套)结构体的方案二
继上一篇 【结构体】解决火山PC传递(嵌套)结构体的优化方案 被官方所嫌弃抽空看了下官方的 @视窗.结构类0 的问题发现问题所在实际上官方的结构体是可以实现的 不过不知道为什么 写了一半就没了....也许另有高招 ???
实际就差一行代码就可以实现了 至于官方改进我也没抱什么希望 民间流传着一句话你尽管提,改了算我输
当然要真改起来并不是那么简单,这我就不关心了,我只教用户现阶段怎么使用
static/image/hrline/1.gif
下面开始分析 手写一个 RECT 一个 SIZE 一个自定义嵌套类
类名 基础类 公开 属性名 属性值备注
RECT类 √ @视窗.结构类 0
成员变量名 类型 公开 静态参考初始值属性名属性值备注
left 整数√
top 整数√
right 整数√
bottom 整数√
--------------------------------------------------------------------------
类名 基础类 公开 属性名 属性值备注
SIZE类 √ @视窗.结构类 0
成员变量名 类型 公开 静态参考初始值属性名属性值备注
x 整数√
y 整数√
---------------------------------------------------------------------------
类名 基础类 公开 属性名 属性值备注
结构体嵌套类 √ @视窗.结构类 0
成员变量名 类型 公开 静态参考初始值属性名属性值备注
i 整数√
rc RECT类√
si SIZE类√
static/image/hrline/1.gif
随便写个程序写个 结构体嵌套类 的对象赋值 调试下(无加密狗) 在我这里输出的对应文件名如下
结构体嵌套类对应 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>:: 表明是基类的函数
static/image/hrline/1.gif
测试用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
static/image/hrline/1.gif
里面还有一个void SetStruct (const S* pInf); 具体的按你们自己的需求自己写方法吧
static/image/hrline/1.gif
个人感觉这个方法也同样简单些你们认为呢 小白也可以使用那几行嵌入行直接复制粘贴就行了
不管怎样一定要注意 S 的使用就目前我观察结果 所有的结构体在对应类中的 结构体声明都是S
直接复制粘贴 也要注意嵌入的 S 对象名 在大环境下 如果有交集 要注意能否区分开来的问题
最后附上案例
不要在纠结结构体了,老老实实的嵌入使用吧! 学习..... 感觉跟不上大神节奏 结构类限制还是太多,没法把结构指针赋给结构体类实例,就是最大的不足 火山结构体太麻烦了,结构体里嵌套结构体数组怎么实现? 怎么获取结构体尺寸? itismine 发表于 2021-10-9 19:29
怎么获取结构体尺寸?
c++的sizeof 609177738 发表于 2021-10-9 20:22
c++的sizeof
@ return (INT)sizeof(this->s); :)学习学习
页:
[1]
2