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

  勇芳 2018-2-16 8967

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


自定义类型

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

成员

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

'Define a UDT called myType, with an Integer member named someVar
Type myType
  As Integer someVar
End Type

'Create a variable of that type
Dim myUDT As myType

'Set the member someVar to 23, then display its contents on the screen
myUDT.someVar = 23
Print myUDT.someVar

请注意,类型...结束类型实际上并不创建该类型的变量,它只定义该类型的变量。您必须创建一个实际使用该类型的变量!


UDT指针

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

Type rect
    x As Integer
    y As Integer
End Type

Dim r As rect
Dim rp As rect Pointer = @r

rp->x = 4
rp->y = 2

Print "x = " & rp->x & ", y = " & rp->y
Sleep


类型别名

变量或对象类型的附加名称

类型别名是类型的替代名称。它们可以用于促进从一种类型到另一种类型的质量更改,保存打字或使循环依赖成为可能。

使用Type关键字声明类型别名,就像用外部或DIM声明变量或对象。

以下示例声明一个类型别名Single,称为“float ”,一个过程,并定义和初始化该类型的两个变量:

Type float As Single

Dim foo As float = 1.23
Dim bar As float = -4.56

过程指针类型别名以相同的方式声明,如以下示例所示:

Type func_t As Function (ByRef As String) As Integer

Dim func As func_t = @f
        
Function f (ByRef arg As String) As Integer
    Function = CInt(arg)
End Function


重载

类别别名就是别名。对于所有意图和目的,类别别名is其别名的类型。因此,就过程重载而言,使用类型“alias_to_T ”参数声明的过程与使用类型“T ”参数声明的过程相同(同样适用于重载成员过程)。

换句话说,这是一个错误重复的定义 - 声明一个过程,其中参数仅在类型和别名中有所不同,如下例所示:

Type float As Single

Declare Sub f Overload (a As Single)

'' If uncommented, this will generate a duplicated definition error
'' Declare Sub f (a As float)


指向过程指针的指针

指向过程指针的指针就像任何其他指针类型一样,除了指向过程指针。因为声明过程指针的语法不允许在过程是函数时直接创建指向过程指针的指针(因为ptr适用于返回类型,而不适用于过程),因此使用类型别名。

以下示例声明一个指向返回整数指针的过程的指针,然后指向指向返回整数的过程的指针:

Dim pf As Function() As Integer Ptr

Type pf_t As Function() As Integer
Dim ppf As pf_t Ptr


输入转发

类型别名可以是前向引用:别名可以引用尚未完全定义的其他类型。

Type foo As bar

Type sometype
  f   As foo Ptr
End Type

Type bar
  st  As sometype
  a   As Integer
End Type

使用类型别名和转发引用允许类型之间的循环依赖关系。

Type list As list_

Type listnode
  parent As list Ptr
  text As String
End Type

Type list_
  first As listnode Ptr
  count As Integer
End Type


不完整的类型

一个类型被认为是不完整的,直到它的大小,即在内存中需要占用的字节数是已知的,并且所有字段的偏移是已知的。不可能为不完整的类型赋值空间。不可能声明具有不完整类型的数据类型的变量,将不完整类型作为参数传递,或访问不完整类型的成员。

然而,指向不完整类型的指针可以被赋值,在其他类型中被声明为成员,或者作为参数传递给过程,因为指针的大小是已知的。

Type sometype As sometype_

'' Not allowed since size of sometype is unknown
'' TYPE incomplete
''   a AS sometype
'' END TYPE

'' Allowed since size of a pointer is known
Type complete
  a As sometype Ptr
End Type
Dim x As complete

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

'' Complete the type
Type sometype_
  value As Integer
End Type

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

Type completed
  a As sometype
End Type

Dim size_completed As Integer = SizeOf( completed )


因国家互联网安全管理要求,关闭回帖功能。大家需要留言,请使用【勇芳软件客服】即时联系勇芳点此打开->>勇芳软件客服
返回
联系勇芳
发新帖 搜索 反馈 回顶部