找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1626|回复: 1

【VFB】用户定义的类型(VFB教程2-5)

[复制链接]

51

主题

31

回帖

648

积分

用户组: 大·技术宅

UID
3260
精华
7
威望
12 点
宅币
506 个
贡献
1 次
宅之契约
0 份
在线时间
23 小时
注册时间
2017-12-26
发表于 2018-2-26 21:38:18 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。


自定义类型
可以由程序员创建的变量的特殊类型。用户定义类型(UDT)实际上只是一个容器,其中包含一些其他变量,如排列,但不同于数组UDT可以容纳different 变量类型(而数组始终包含same 的许多变量)类型)。事实上,UDT甚至可以拥有程序!

成员
存储在UDT内的不同变量和/或过程称为“成员”,或更一般地称为项。成员可以是任何类型的变量,包括数值类型,字符串指针,枚举,甚至数组。变量在UDT中创建的方式与变量正常创建的方式大致相同,但Dim关键字是可选的。UDT成员可以通过。操作者访问,所以例如,如果您在UDT中创建了一个名为someVar的变量,您将使用UDT变量的名称后跟“.someVar”来访问它。这是一个例子:
  1. 'Define a UDT called myType, with an Integer member named someVar
  2. Type myType
  3.   As Integer someVar
  4. End Type

  5. 'Create a variable of that type
  6. Dim myUDT As myType

  7. 'Set the member someVar to 23, then display its contents on the screen
  8. myUDT.someVar = 23
  9. Print myUDT.someVar
复制代码
请注意,类型...结束类型实际上并不创建该类型的变量,它只定义该类型的变量。您必须创建一个实际使用该类型的变量!


UDT指针

顾名思义,UDT指针是指向UDT的指针。它们被创建为常规指针,但有一种特殊的方式来使用它们。要访问由指针指向的UDT的成员,请使用 - >运算符.例如,如果myUDTPtr是一个指向具有成员someVar的UDT的指针,那么您将访问成员为myUDTPtr->someVar,这对于同样有效的*(myUDTPtr).someVar是一个更为清晰的简写。
  1. Type rect
  2.     x As Integer
  3.     y As Integer
  4. End Type

  5. Dim r As rect
  6. Dim rp As rect Pointer = @r

  7. rp->x = 4
  8. rp->y = 2

  9. Print "x = " & rp->x & ", y = " & rp->y
  10. Sleep
复制代码


类型别名

变量或对象类型的附加名称
类型别名是类型的替代名称。它们可以用于促进从一种类型到另一种类型的质量更改,保存打字或使循环依赖成为可能。
使用Type关键字声明类型别名,就像用外部或DIM声明变量或对象。
以下示例声明一个类型别名Single,称为“float ”,一个过程,并定义和初始化该类型的两个变量:
  1. Type float As Single

  2. Dim foo As float = 1.23
  3. Dim bar As float = -4.56
复制代码
过程指针类型别名以相同的方式声明,如以下示例所示:
  1. Type func_t As Function (ByRef As String) As Integer

  2. Dim func As func_t = @f
  3.         
  4. Function f (ByRef arg As String) As Integer
  5.     Function = CInt(arg)
  6. End Function
复制代码


重载

类别别名就是别名。对于所有意图和目的,类别别名is其别名的类型。因此,就过程重载而言,使用类型“alias_to_T ”参数声明的过程与使用类型“T ”参数声明的过程相同(同样适用于重载成员过程)。
换句话说,这是一个错误重复的定义 - 声明一个过程,其中参数仅在类型和别名中有所不同,如下例所示:
  1. Type float As Single

  2. Declare Sub f Overload (a As Single)

  3. '' If uncommented, this will generate a duplicated definition error
  4. '' Declare Sub f (a As float)
复制代码


指向过程指针的指针

指向过程指针的指针就像任何其他指针类型一样,除了指向过程指针。因为声明过程指针的语法不允许在过程是函数时直接创建指向过程指针的指针(因为ptr适用于返回类型,而不适用于过程),因此使用类型别名。
以下示例声明一个指向返回整数指针的过程的指针,然后指向指向返回整数的过程的指针:
  1. Dim pf As Function() As Integer Ptr

  2. Type pf_t As Function() As Integer
  3. Dim ppf As pf_t Ptr
复制代码


输入转发

类型别名可以是前向引用:别名可以引用尚未完全定义的其他类型。
  1. Type foo As bar

  2. Type sometype
  3.   f   As foo Ptr
  4. End Type

  5. Type bar
  6.   st  As sometype
  7.   a   As Integer
  8. End Type
复制代码
使用类型别名和转发引用允许类型之间的循环依赖关系。
  1. Type list As list_

  2. Type listnode
  3.   parent As list Ptr
  4.   text As String
  5. End Type

  6. Type list_
  7.   first As listnode Ptr
  8.   count As Integer
  9. End Type
复制代码


不完整的类型

一个类型被认为是不完整的,直到它的大小,即在内存中需要占用的字节数是已知的,并且所有字段的偏移是已知的。不可能为不完整的类型赋值空间。不可能声明具有不完整类型的数据类型的变量,将不完整类型作为参数传递,或访问不完整类型的成员。
然而,指向不完整类型的指针可以被赋值,在其他类型中被声明为成员,或者作为参数传递给过程,因为指针的大小是已知的。
  1. Type sometype As sometype_

  2. '' Not allowed since size of sometype is unknown
  3. '' TYPE incomplete
  4. ''   a AS sometype
  5. '' END TYPE

  6. '' Allowed since size of a pointer is known
  7. Type complete
  8.   a As sometype Ptr
  9. End Type
  10. Dim x As complete

  11. '' Not allowed since size of sometype is still unknown
  12. '' DIM size_sometype AS INTEGER = SIZEOF( sometype )

  13. '' Complete the type
  14. Type sometype_
  15.   value As Integer
  16. End Type

  17. '' Allowed since the types are now completed
  18. Dim size_sometype As Integer = SizeOf( sometype )

  19. Type completed
  20.   a As sometype
  21. End Type

  22. Dim size_completed As Integer = SizeOf( completed )
复制代码


回复

使用道具 举报

1

主题

159

回帖

622

积分

用户组: 大·技术宅

UID
7535
精华
0
威望
0 点
宅币
462 个
贡献
0 次
宅之契约
0 份
在线时间
71 小时
注册时间
2021-10-16
发表于 2022-5-17 11:15:53 | 显示全部楼层

你们懂的,楼主好人
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 06:41 , Processed in 0.040451 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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