2013-04-28 72 views
1

如何初始化类中的数组属性?如何初始化以下阵列1:如何初始化ASP经典类中的数组属性?

class Class1 
    private count 
    private array1 

    private sub class_initialize 
     count  = 0 
     array1(0) = 0 'initialize first element 
    end sub 

end class 

导致错误: Microsoft VBScript运行时错误 '800a000d' 类型不匹配:数组1'

回答

0

由于改革的班级无法正常工作,ShadowWizards的评论是危险的:

Option Explicit 

class ArrMemberA 
    private count 
    private array1 

    private sub class_initialize 
     count = 0 
     array1 = array() 'initialize array property 
    end sub 

    'to add a new element to array property 
    public sub add(input) 
     redim preserve array1(count + 1) 
     array1(count) = input 
     count = count + 1 
    end sub 

    Public Function toString() 
     toString = "[" & Join(array1, "*") & "]" 
    End Function 
end class 

Class ArrMemberB 
    Private m_a 
    Private Sub Class_Initialize 
    m_a = Array() ' initialize to empty dynamic array 
    End Sub 
    Public Sub add(input) 
    ReDim Preserve m_a(UBound(m_a) + 1) 
    m_a(UBound(m_a)) = input 
    End Sub 
    Public Function toString() 
    toString = "[" & Join(m_a, "*") & "]" 
    End Function 
End Class 

Class ArrMemberC 
    Private m_a() 
    Public Sub add(input) 
    ReDim Preserve m_a(UBound(m_a) + 1) 
    m_a(UBound(m_a)) = input 
    End Sub 
    Public Function toString() 
    toString = "[" & Join(m_a, "*") & "]" 
    End Function 
End Class 

Class ArrMemberD 
    Private m_a() 
    Private m_n 
    Private Sub Class_Initialize 
    m_n = -1 ' initialize to empty ubound 
    End Sub 
    Public Sub add(input) 
    m_n = m_n + 1 
    ReDim Preserve m_a(m_n) 
    m_a(m_n) = input 
    End Sub 
    Public Function toString() 
    toString = "[" & Join(m_a, "*") & "]" 
    End Function 
End Class 

Dim a : Set a = New ArrMemberA 
a.add "zero" 
a.add "one" 
WScript.Echo "a:", a.toString(), "- spurious empty tail element" 

Dim b : Set b = New ArrMemberB 
b.add "zero" 
b.add "one" 
WScript.Echo "b:", b.toString() 

Dim c : Set c = New ArrMemberC 
On Error Resume Next 
c.add "zero" 
WScript.Echo "c:", Err.Description, "- Ubound() fails for the abomination created by 'Private m_a()'" 
On Error GoTo 0 

Dim d : Set d = New ArrMemberD 
d.add "zero" 
d.add "one" 
WScript.Echo "d:", d.toString() 

输出:

cscript demoarray.vbs 
a: [zero*one*] - spurious empty tail element 
b: [zero*one] 
c: Subscript out of range - Ubound() fails for the abomination created by 'Private m_a()' 
d: [zero*one] 

(a)显示自己的计数器有风险; (b)这是我的方式; (c)证明“Dim/Private/Public varname()”的结果不能是UBound(); (d)证明'使其工作',你需要你试图避免的Class_Initialize子类。

+0

谢谢你的回答。你能给我举一个例子,说明我的课程无法正常工作吗?我可以将选择的答案更改为这一个。 – reformed 2013-08-08 19:48:50

+0

@reformed - 一个案例表明你的类创建了一个虚假的空尾元素的数组,因为count从0开始,第一个将ReDims加到0 + 1(== 1 ==一个包含索引为0和1的2个元素的数组(等等)。 – 2013-08-08 20:01:58

1

我想通了:

class Class1 
    private count 
    private array1 

    private sub class_initialize 
     count = 0 
     array1 = array() 'initialize array property 
    end sub 

    'to add a new element to array property 
    public sub add(input) 
     redim preserve array1(count + 1) 
     array1(count) = input 
     count = count + 1 
    end sub 
end class 
+2

你也可以只用'private array1()'然后在'array1 = array()'中不需要'' – 2013-04-28 07:52:58

+0

@ShadowWizard谢谢你的支持 – reformed 2013-04-28 18:58:24