你不都写出来了吗??还问什么?
在另外一个模块里写一个函数
function GetData() as mystruct
dim tpreturn as new mystruct '这里一定要 new 因为 tpreturn 是要实际存在的要返回的
set GetData = tpreturn '这样其他地方调用了 GetData 以后就得到了 tpreturn 同性质的类(或者结构)
end function
对于类也就是 *.cls 中定义的模块,一定要记得用 set ,在返回函数中也一样
dim tp as mystruct '这里不需要new,因为下面我会赋值
dim dodo as new mySecondStruct '这里要nwe
set tp = dodo.GetData() '这里赋值了,但是要记得用 set
也就是说 set 传递一个引用,和C++中的引用类似
多谢了
是的,完全正确!
记住 类在vb下是特殊的,所有 set a = b 其实都是同一个对象,set a=nothing 只是减少一个计数,并不是真正让这个对象消失了,这和c是不同的,
我继续多说一点,这点是很多vb高手都弄不清楚的(因为他们并不知道什么是对象的本质,也就是没有很好的C++基础),在vb中对象的传递统统是按址的(byref)即使你指明按值 (byval),那也不是真正的按值,传过去的还是地址的值(用c的话就是本质还是传的指针)
详细举例如下:
'1 执行了下面的语句以后,其实 a,b,c,d 都是同一个对象,这就是我前面说的引用计数
set a=b:set c=b :set d = a
'2 清除的问题
set a=nothing:set b=nothing:set c=nothing ' 这个时候 a,b,c 都是nothing , 但是对象并没有真正删除,d 还是存在的
set d =nothing ‘这个时候对象没有了,因为计数为0了,所以发现是0的时候就真正的清楚了内存了。
'3 类做为参数的时候的问题
sub test1(byval tp class1)
tp.num=tp.num+1
end sub
'其实和
sub test2(byref tp class1)
tp.num=tp.num+1
end sub
'表现起来没有什么不同
dim tp1 as new class1
dim tp2 as new class1
tp1.num=0:tp2.num=0
call test1(tp1):call test2(tp2)
'这个时候tp1 和 tp2 的num 都是1,也就是说byval和 byref 一样,传入的类在函数内部变化以后,类也就变化了(当然,因为根本就是同一个类,不管你byval还是byref)
看来VB也真够麻烦的,还有就是VB好像不能直接进行类的COPY,如
dim a as new class1
dim b as new class1
a.init(xxxxxx,xxxx,xxxx)
! ]& l g/ T& x$ | S7 H' _b = a '错误
% S8 L7 a. ?4 a. x- g或者是不是有什么关于类的VB函数用来复制?
/ ~6 a3 b3 |4 z, h8 i 或者说VB的类的复制函数要自己写/ d: ~( e, r4 A0 Q* [* V你的问题仔细看我上面的答复,说的很清楚了
我的意思是这样的
* t& N( n* I1 {0 s' Lmyclass.cls(myclass)
public a as integer
public b as string
# L- I1 h% p. e( H/ i--------------------------------------------
1 ?0 U! |2 ?2 R; h5 P) T然后在使用中
( Z6 l4 \* F+ u0 i9 Hdim y as new myclass
'把x复制给y,不要使用引用方式,x,y相对独立,也就是说x改变而不影响y
'x是一个已经存在的myclass的实例
* N3 h8 f* i9 k) H) Ty =x
% A2 o: A1 R4 q3 c'y.a = x.a
'y.b = x.b
'我后来想了想可以使用VB的默认属性这个东西
" \6 E4 I' K1 s7 K) x. v很不幸,好像没有这个功能,vb天生就不支持自动构造。
a=b 这个对于类是不行的,如果想实现你复制的要求,那只有你自己写代码了,其实也就是成员数据拷贝
你可以笨办法 :
a.p1=b.p1
a.p2=b.p2
.
.
.
如果你的经常要做类间的复制操作,那么就在类中写一个复制函数
function CopyMyClass(src as myclass)
a.p1=b.p1:a.p2=b.p2 : ...
end function
然后使用的时候就可以 a.CopyMyClass(b)
欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) | Powered by Discuz! X3.3 |