递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 2013|回复: 8
打印 上一主题 下一主题

[视窗] 关于视窗.结构类,没有封装取结构体指针函数吗?

[复制链接]

50

主题

548

帖子

2327

积分

金牌会员

Rank: 6Rank: 6

积分
2327
跳转到指定楼层
楼主
发表于 2023-11-3 19:06:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
是不是c++也没有?难道全球都是以成员1首地址作指针的!!

如果本来就没有相关函数,还要加加减减才得出指针的话!!那就直接取成员1首地址还高效了!!
回复

使用道具 举报

444

主题

1万

帖子

3万

积分

超级版主

Rank: 8Rank: 8

积分
39427
沙发
发表于 2023-11-3 19:38:04 | 只看该作者

封了





安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

50

主题

548

帖子

2327

积分

金牌会员

Rank: 6Rank: 6

积分
2327
板凳
 楼主| 发表于 2023-11-3 19:54:30 | 只看该作者

怎么感觉是在把整个结构复制到指定内存?我想要一个像取变量地址()一样高效的.取结构体指针()
回复

使用道具 举报

26

主题

1813

帖子

6629

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6629
地板
发表于 2023-11-3 22:02:41 | 只看该作者
你要先了解火山的结构类是什么:
1、结构类首先它本身是一个基于火山对象类的 C++ 类,而不是结构体。
2、它内部定义了一个真的结构体类型,名称为 结构类::S。
3、结构类并没有 S 结构体类型的成员变量,那就是它默认是不会将结构体实例化的。

综上:
1、你不可能直接取结构类之中的结构体指针,因为它只是个类型,必须将「结构类::S」实例化,才能取它的指针。
2、实例化之后,还要调用结构类内部的 SetStruct、GetStruct 方法来将结构类和结构体的数据互相复制。
3、取结构类首成员的地址,一定程度可以跟结构体地址差不多。
4、如果是一些内存对齐比较特别的结构体,结构类跟结构体的内存布局会不一样,这种就不能将结构类首成员地址当结构体地址使用。
回复

使用道具 举报

26

主题

1813

帖子

6629

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6629
5#
发表于 2023-11-3 22:08:18 | 只看该作者
火山还提供了另一种叫做「结构基础类」的封装。
这种封装会在类成员里将结构体实例化,然后通过结构体指针来访问结构体的成员。
这种封装获取结构体指针会很简单,你可以看一下官方的例子。

但有两个主要缺点:
1、这种结构体封装要自己写访问结构体成员的属性读和属性写方法。
2、这种结构体不能在表格封装 DLL 函数中使用;

评分

参与人数 1金钱 +5 收起 理由
呵呵仙8 + 5 很给力!学习了,谢谢!!

查看全部评分

回复

使用道具 举报

67

主题

958

帖子

4224

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4224
6#
发表于 2023-11-3 22:33:32 | 只看该作者
Xelloss0618 发表于 2023-11-3 22:02
你要先了解火山的结构类是什么:
1、结构类首先它本身是一个基于火山对象类的 C++ 类,而不是结构体。
2、 ...

好像c++的类会和结构体一样字节对齐。

回复

使用道具 举报

67

主题

958

帖子

4224

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4224
7#
发表于 2023-11-3 22:35:51 | 只看该作者
本帖最后由 hcwanz 于 2023-11-3 23:07 编辑

所以理论上普通的结构体确实可以直接取首成员地址,当作结构体地址。不过嵌套还是不行。
回复

使用道具 举报

26

主题

1813

帖子

6629

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6629
8#
发表于 2023-11-4 00:30:14 | 只看该作者
hcwanz 发表于 2023-11-3 22:33
好像c++的类会和结构体一样字节对齐。

只能说大部分结构体和 C++ 类的默认内存布局差不多,但不能完全保证一样。
比如下面的例子,把对齐字节改动一下,就马上不一样了。


回复

使用道具 举报

67

主题

958

帖子

4224

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4224
9#
发表于 2023-11-4 11:09:24 | 只看该作者
本帖最后由 hcwanz 于 2023-11-4 14:36 编辑
Xelloss0618 发表于 2023-11-4 00:30
只能说大部分结构体和 C++ 类的默认内存布局差不多,但不能完全保证一样。
比如下面的例子,把对齐字节改 ...

这是因为对字节对齐进行的设置导致的。因为火山只在定义结构体时定义了这个参数,如果在类定义时一同定义就不会不同了



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-9-28 10:36 , Processed in 0.104783 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表