2

ここでは、1 つの辞書を使用して、カスタム クラス内の属性として保持されている 2 つの異なる辞書を設定するコードを少し使用しています。私は効率のためにこれを行います。

注: 設定したい属性ごとにディクショナリを使用することで、この問題の回避策がありますが、これはあまり効率的ではありません。

大まかに私のコードは次のとおりです。

for iKey = 1 to class.maxnumber ' 8
    dTempDict.add iKey, cdbl(24)   ' enforce to 24 for calcs later
next iKey

Set class.dict1 = dTempDict ' commit to class.dict1

dTempDict.removeall 'wipe temp dictionary

for iKey = 1 to class.maxnumber ' 8
    dTempDict.add iKey, "word"   ' something other than 24 to test
next iKey

Set class.dict2 = dTempDict

したがって、上記は正常に機能します。次に、ループしてclass.dict1のキーを問題なく出力しようとしました。次に、値を事前に宣言された dbl に割り当てようとしたときに、問題が発生しました。次に、byref を渡す別のサブクラスで、次のように各キーをループしました。

dim dTempDict as scripting.dictionary
Set dTempDict = class.dict1 
for each iKey in dTempDict
 msgbox typename(dTempDict.Item(iKey))
next iKey

これにより、結果が返されました...「文字列」...紛らわしい。次に、値ホルダーを文字列に変更しましたが、うまくいきました。クラス内のアクセサーを確認しましたが、間違ったディクショナリ属性にループバックしないため、2 番目に割り当てて .removeall を実行しても、2 番目のディクショナリの値が最初のディクショナリに取り込まれます。

何か案は?

上記のように、class.dict1 と class.dict2 に異なる一時辞書を使用すると、正しく割り当てられますが、これはまだ混乱を招きます。

4

2 に答える 2

0

あなたがこれをするとき...

Set class.dict1 = dTempDict 
dTempDict.removeall 
'...
Set class.dict2 = dTempDict

...次に、両方dict1dict2同じディクショナリオブジェクト(dTempDict)を指します。

あるオブジェクト変数を別のオブジェクト変数に割り当てると、そのオブジェクトのコピーは作成されませんが、同じオブジェクトへの追加の「ポインタ」が作成されます。

同じ辞書を再利用して割り当てるのではなく、新しい辞書を作成する必要がありますdict2

于 2013-02-28T19:37:14.690 に答える
0

一般に、他のクラスを開催する場合を除いて、クラスに辞書を配置するのは好きではありません。私はあなたの状況を知らないので、それについてコメントすることはできません。しかし、「24」が何であれ、それは独自のオブジェクトである必要があり、クラスには別のコレクション クラスが含まれると考えるかもしれません。ちなみに、私はそのために辞書ではなくコレクションを使用しています。次に、次のようなものにアクセスします

clsDepartment.Employees.Count

それ以外の

clsDepartment.mydict(1)

とにかく、あなたが持っているものについては、一時辞書を作成するのではなく、クラスに辞書を設定する必要があります。あなたのクラスがこのように見える場合

Private mdcTwentyFour As Scripting.Dictionary
Private mdcNotTwentyFour As Scripting.Dictionary

Public Property Get TwentyFour() As Scripting.Dictionary
    Set TwentyFour = mdcTwentyFour
End Property

Public Property Get NotTwentyFour() As Scripting.Dictionary
    Set NotTwentyFour = mdcNotTwentyFour
End Property

Public Property Get MaxNumber() As Long
    MaxNumber = 8
End Property

Private Sub Class_Initialize()

    Set mdcTwentyFour = New Scripting.Dictionary
    Set mdcNotTwentyFour = New Scripting.Dictionary

End Sub

次に、サブは次のようになります

Sub FillClassDicts()

    Dim clsClass As CClass
    Dim i As Long

    Set clsClass = New CClass

    For i = 1 To clsClass.MaxNumber
        clsClass.TwentyFour.Add i, 24
        clsClass.NotTwentyFour.Add i, "word"
    Next i

    Debug.Print clsClass.TwentyFour.Count, clsClass.NotTwentyFour.Count
    Debug.Print TypeName(clsClass.TwentyFour(1)), TypeName(clsClass.NotTwentyFour(5))

End Sub
于 2013-02-28T22:14:49.470 に答える