开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

12
返回列表 发新帖
楼主: 已注销41434
收起左侧

[易语言纯源码] 类中申明的变量数据地址是静态!静态!

[复制链接]
头像被屏蔽
结帖率:100% (4/4)
 楼主| 发表于 2023-1-9 07:56:46 | 显示全部楼层   安徽省合肥市
福仔 发表于 2023-1-9 00:27
怎么会是静态呢? 你每次都从一个局部对象里获取一个值, 然后赋值给m_this, 然后这个局部对象又释放了, 下次 ...

想实现动态 new 一个类
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:100% (4/4)
 楼主| 发表于 2023-1-9 07:54:57 | 显示全部楼层   安徽省合肥市
福仔 发表于 2023-1-9 00:27
怎么会是静态呢? 你每次都从一个局部对象里获取一个值, 然后赋值给m_this, 然后这个局部对象又释放了, 下次 ...

更新了下
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:100% (4/4)
 楼主| 发表于 2023-1-9 07:54:37 | 显示全部楼层   安徽省合肥市
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2023-1-9 07:40:38 | 显示全部楼层   四川省成都市
瞅瞅看
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)
发表于 2023-1-9 01:13:08 | 显示全部楼层   广东省惠州市
呵呵呵,可以哦
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 13 天

发表于 2023-1-9 00:38:53 | 显示全部楼层   广西壮族自治区崇左市
  
子程序名返回值类型公开备 注
WinMain  
变量名类 型静态数组备 注
Instance1Instance 
Instance2Instance 
Instance3Instance 
Instance1.Name (“Instance1”)
Instance2.Name (“Instance2”)
Instance3.Name (“Instance3”)
Instance1.CallBack (1111)
Instance2.CallBack (2222)
Instance3.CallBack (3333)
Instance1.Attach (1)  ' 我把源码的attath给加了个公开, 为的就是能把值写入成员变量
Instance2.Attach (2)
Instance3.Attach (3)
Instance1.Instance ()
Instance2.Instance ()
Instance3.Instance ()
输出成员变量 (_取变量地址 (Instance1))
输出成员变量 (_取变量地址 (Instance2))
输出成员变量 (_取变量地址 (Instance3))
调试输出 (“#WinMain”)
子程序名返回值类型公开备 注
输出成员变量  
参数名类 型参考可空数组备 注
this整数型
变量名类 型静态数组备 注
pVar整数型 
var整数型 
pVar = 取类变量地址 (this, 1)
var = 指针到整数 (pVar)
调试输出 (“第1个成员变量, 是Base类的 m_name”, pVar, var, 指针到文本 (var))
pVar = 取类变量地址 (this, 2)
var = 指针到整数 (pVar)
调试输出 (“第2个成员变量, 是Data类的 m_callback”, pVar, var)
pVar = 取类变量地址 (this, 4)
var = 指针到整数 (pVar)
调试输出 (“第4个成员变量, 是Route类的 m_object”, pVar, var)
pVar = 取类变量地址 (this, 8)
var = 指针到整数 (pVar)
调试输出 (“第8个成员变量, 是Instance类的 m_this”, pVar, var, #换行符 )
' 我也不知道为什么他们的顺序会这样, 但是通过类内输出变量地址和这里获取到的地址对比, 他们就是一个值



i支持库列表   支持库注释   
spec特殊功能支持库



输出下面这一段

* “#Attach” | “Instance” | “Base” | 6842320 | 0
* “#Attach” | “Instance” | “Base” | 6897640 | 0
* “#Attach” | “Instance” | “Base” | 6897704 | 0
* “#Attach” | “Instance” | “Base” | 6898280 | 0
* “#Attach” | “Instance” | “Base” | 6898280 | 0
* “#Attach” | “Instance” | “Base” | 6898280 | 0
* “第1个成员变量, 是Base类的 m_name” | 6842324 | 6897808 | “Instance1”
* “第2个成员变量, 是Data类的 m_callback” | 6842328 | 1111
* “第4个成员变量, 是Route类的 m_object” | 6842336 | 1
* “第8个成员变量, 是Instance类的 m_this” | 6842352 | 6898280 | “

* “第1个成员变量, 是Base类的 m_name” | 6897644 | 6898200 | “Instance2”
* “第2个成员变量, 是Data类的 m_callback” | 6897648 | 2222
* “第4个成员变量, 是Route类的 m_object” | 6897656 | 2
* “第8个成员变量, 是Instance类的 m_this” | 6897672 | 6898280 | “

* “第1个成员变量, 是Base类的 m_name” | 6897708 | 6898240 | “Instance3”
* “第2个成员变量, 是Data类的 m_callback” | 6897712 | 3333
* “第4个成员变量, 是Route类的 m_object” | 6897720 | 3
* “第8个成员变量, 是Instance类的 m_this” | 6897736 | 6898280 | “

* “#WinMain”
* “#Detach” | “Instance” | “Instance1” | 6842320 | “坑爹啊这个地址是个静态的变量>>>” | 6898280
* “#Detach” | “Instance” | “Instance2” | 6897640 | “坑爹啊这个地址是个静态的变量>>>” | 6898280
* “#Detach” | “Instance” | “Instance3” | 6897704 | “坑爹啊这个地址是个静态的变量>>>” | 6898280

点评

我是真不知道这个成员变量继承是怎么算的, 多继承一次, 成员变量位置变成 16, 再继承一次, 变32, 再继承一次 变64, 再继承一次变128.....   广西壮族自治区崇左市  发表于 2023-1-9 00:50
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 13 天

发表于 2023-1-9 00:27:36 | 显示全部楼层   广西壮族自治区崇左市
怎么会是静态呢? 你每次都从一个局部对象里获取一个值, 然后赋值给m_this, 然后这个局部对象又释放了, 下次又申请, 又申请到了相同的地址
然后你又把相同的地址赋值给m_this, 这样3个类的m_this都是一个值, 这有什么错吗?

还有我不太确定易语言这个继承的变量尺寸到底怎么算, 按常规理解应该是每个整数型成员变量占用4个字节才对
这样继承下来的话, m_this 这个变量应该是第4个成员变量才对, 但是实际输出的话却是第8个变量
p = _取变量地址 (Instance1)' 类指针
pVar = 指针到整数 (p) + 8 × 4' 第0个成员是虚表, 第一个成员是基类的第一个成员变量, 但是不知道为什么Instance这个类的成员变量位置变成了8....
var = 指针到整数 (pVar)' 这个就是 m_this 的值了, 输出 pVar 来看的话, 几个类输出的都不是一个地址, 所以可以确定他们不是静态变量

还有你Base类下的 New方法
把value的值写入到 [[this]+0] 里, [[this]+0] 这个是虚表
你这个 Instance类下的 Instance 方法是把局部变量的这个对象的虚表写入到当前对象的虚表里?
好像差不多是这么个意思, 如果猜错, 还请指教一下, 如果我没猜错的话, 这个没什么意义啊, 同一个类出来的对象, 他们的虚表是一样的啊
[this] + 0 = 虚表地址
[this] + 4 = 第一个成员变量地址
你这个方法只修改了 [this] + 0 这个地址里的数据, 并没有修改到 [this] + 4 之后的数据

大概就这样, 因为我看你的 _销毁 下输出 调试输出 (“#Detach”, 取程序名称 (2), Name (), This (), “坑爹啊这个地址是个静态的变量>>>”, m_this)
然后我就认为你是看到m_this都是同一个值然后判断是静态

点评

可以理解为易语言的同一个类的this指向是一个地址 简单之间就是一个 参考属性是一个假的   安徽省合肥市  发表于 2023-1-9 08:08
关于this指向问题 如 类2 = 类1.new 类3= 类2.get() 类3.call()= 类2.call()   安徽省合肥市  发表于 2023-1-9 08:04
关键点不在成员变量 而是类变量地址   安徽省合肥市  发表于 2023-1-9 08:02
易语言在形参里面干了些什么 总之! 多出来一个释放内存的调用 马上要上班了 矮 晚点再继续研究   安徽省合肥市  发表于 2023-1-9 08:02
https://bbs.125.la/thread-14273328-1-1.html 可以参考这个帖, 虽然没有把所有类的特性都讲到, 但是也算是论坛里讲得很全的一个帖子了   广西壮族自治区崇左市  发表于 2023-1-9 00:42
回复 支持 反对

使用道具 举报

结帖率:70% (7/10)

签到天数: 17 天

发表于 2023-1-8 22:34:49 | 显示全部楼层   甘肃省平凉市
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 2023-1-8 22:30:27 | 显示全部楼层   浙江省金华市
没人告诉你易语言的类 是正常类
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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