2016-08-25 2 views
1

Я написал небольшую программу, которая поможет мне научиться работать с массивами объектов в VBScript, и я получаю некоторые результаты, которые не совсем понятны. Я не понимаю, почему весь массив заполняется последней записью объекта, когда я иду распечатать его.Понимание массивов объектов и области видимости в VBScript

Class TestObj 
    Public id 
End Class 

Dim arr() 
Set tObj = new TestObj 

Public Function fillArray() 
    ReDim arr(10) 

    For i = 0 To 9 Step 1 
     Call createObj() 
     Set arr(i) = tObj 
    Next 

    'Print the array in this function 
    Print ("Printing from fillArray function") 
    For i = 0 To 9 Step 1 
     Print ("arr("&i&"):"& arr(i).id) 
    Next 

    Call printArray() 
End Function 

Public Function createObj() 
    max = 100 
    min = 1 
    Randomize 
    randInt = (int((max-min+1)*Rnd+min)) 
    Print ("Random Integer is: " &randInt) 
    tObj.id = randInt 
End Function 


Public Function printArray() 
    size = UBound(arr) 
    Print ("Printing from printArray function") 

    For i = 0 To size-1 Step 1 
     Print ("arr("&i&"):"& arr(i).id) 
    Next 
End Function 


Call fillArray() 

Выход заключается в следующем:

Random Integer is: 80 
Random Integer is: 92 
Random Integer is: 70 
Random Integer is: 10 
Random Integer is: 18 
Random Integer is: 100 
Random Integer is: 27 
Random Integer is: 47 
Random Integer is: 34 
Random Integer is: 60 
Printing from fillArray function 
arr(0):60 
arr(1):60 
arr(2):60 
arr(3):60 
arr(4):60 
arr(5):60 
arr(6):60 
arr(7):60 
arr(8):60 
arr(9):60 
Printing from printArray function 
arr(0):60 
arr(1):60 
arr(2):60 
arr(3):60 
arr(4):60 
arr(5):60 
arr(6):60 
arr(7):60 
arr(8):60 
arr(9):60 

Так как мы можем видеть, последний объект был создан с идентификатором 60, а некоторые, как каждый индекс массива теперь содержит этот объект.

ответ

5

У вас есть ровно один tObj, который последовательно присваивает идентификационные номера. Когда вы начинаете печатать, этот tObj содержит последний идентификатор.

Если вы хотите (чтобы узнать о) массивах объектов (без зверств, как глобал, звоните, Dim х(), или неправильно/не-понимания размера массива/UBOUND), а затем посмотреть на

Option Explicit 

Class cX 
    Public mnId 
    Public Function ctor(nId) 
    Set ctor = Me 
    ctor.mnId = nId 
    End Function 
End Class 

Sub printArrayofX(a) 
    Dim i 
    For i = 0 To UBound(a) 
     Wscript.Echo a(i).mnId 
    Next 
End Sub 

ReDim a(3) 
Dim i 
For i = 0 To UBound(a) 
    Set a(i) = New cX.ctor(i) 
Next 

printArrayofX a 

выход:

cscript 39151577-2.vbs 
0 
1 
2 
3 
Смежные вопросы