我正试图围绕AHK的课程。我是C ++ dev,所以想使用RAII(__New
,__Delete
),但看起来我错过了一些概念,因为对我来说,事情看起来非常直观。
经过一些尝试,我想出了这个简单的例子:
class Scenario
{
__New()
{
MsgBox, NEW
}
__Delete()
{
MsgBox, DELETE
}
}
scenario := new Scenario
scenario := new Scenario
scenario := 1
scenario := {}
scenario := new Scenario
Return
因此,我收到以下消息:
问题:
scenario
变量如何保存两个引用?答案 0 :(得分:0)
- 为什么在第二次分配期间对象没有被销毁?
醇>
尚未触发垃圾收集
我假设参考数量为0,没有?
引用为0的引用不一定会触发GC
- 我怎么连续两次破坏?
醇>
垃圾收集同时清除了两个引用
同时存储该对象的位置是什么?
堆
情景变量怎样才能同时包含两个引用?
scenario
不包含两个引用
- 为什么第三个建筑没有被召唤?
醇>
只构造了两个Scenario对象。变量scenario
是动态变量,并不总是类Scenario
的实例。最后一个作业scenario := {}
只是创建一个空对象。
答案 1 :(得分:0)
好的,找出了遗漏的东西。两件事:
class
在AHK中是一个对象,因此可以用另一个对象覆盖该类。Here是文档的一部分:
因为类是通过变量引用的,所以类名不能用于引用类并在同一上下文中创建单独的变量(例如保存类的实例)。例如,
box := new Box
将使用自身的实例替换Box中的类对象。 [v1.1.27 +]:#Warn ClassOverwrite
允许在加载时显示每次覆盖类的尝试警告。
这解释了上面代码中发生的事情:变量名scenario
实际上与类名Scenario
相同,所以我只是用空对象悄悄地覆盖我的类。
此外,由于在分配之前创建了类的新实例,因此我连续两个“NEW”,而不是“DELETE”。