下沙论坛

标题: VB问题之二…… [打印本页]

作者: 游侠无极限    时间: 2005-4-29 14:42
标题: VB问题之二……
如果返回一个类模块类型?! T  F- ^: ^5 z
比如工程中有一类模块:(其实就是作为一个自定义的数据类型)4 `: x' A3 X# H1 \4 @$ q, N
mystruct.cls
/ W/ q$ t3 G; ]& R3 bpublic dd as integer
% f* ^& g5 b. N8 j: D) `public ss as string# ]+ h" e7 Q9 z2 v+ _; @

* a$ n* S7 k; H# M想要在另一个类模块中实现这个一个函数
. q1 `1 Q# B' b# ~! C- I6 apublic function GetData() as mystruct
- H. E) j5 T5 u# ]- g' a2 d怎么做??
作者: yzhlinux    时间: 2005-4-29 15:16

你不都写出来了吗??还问什么?

在另外一个模块里写一个函数

function GetData() as mystruct

dim tpreturn as new mystruct '这里一定要 new 因为 tpreturn 是要实际存在的要返回的

set GetData = tpreturn '这样其他地方调用了 GetData 以后就得到了 tpreturn 同性质的类(或者结构)

end function


作者: yzhlinux    时间: 2005-4-29 15:18

对于类也就是 *.cls 中定义的模块,一定要记得用 set ,在返回函数中也一样

dim tp as mystruct '这里不需要new,因为下面我会赋值

dim dodo as new mySecondStruct '这里要nwe

set tp = dodo.GetData() '这里赋值了,但是要记得用 set


作者: 游侠无极限    时间: 2005-4-29 15:56

也就是说 set 传递一个引用,和C++中的引用类似

多谢了


作者: yzhlinux    时间: 2005-4-29 21:37
我知道你应该是对 set 的使用有不理解,所以后来特意加上“对于类也就是 *.cls  中定义的模块,一定要记得用 set” 这个。
% q3 i$ `) O3 z  D! p% S$ Z4 ]+ _“也就是说 set  传递一个引用,和C++中的引用类似” 你可以这么理解,但是你要记住,其本质并不是这样,反而 ,和C++中的引用是完全不同,没有任何类似的地方,set 起底层的实现机制肯定是 com 的原理,起保持引用而不释放new出来的东西是因为计数的问题,而 set 就是处理计数的地方。和 com 中的 AddRef 到是类似。
作者: 游侠无极限    时间: 2005-4-29 23:19
set xx =nothing 就是减少一次引用?
作者: yzhlinux    时间: 2005-4-30 00:03

是的,完全正确!

记住 类在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)


作者: 游侠无极限    时间: 2005-4-30 12:14

看来VB也真够麻烦的,还有就是VB好像不能直接进行类的COPY,如

( Y% r( ~, e6 y- u2 {$ p0 _- `

dim a as new class1

! f5 `" T( m% o

dim b as new class1

) w; r) Q$ Q5 X% h$ K$ _& _

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
[此贴子已经被作者于2005-4-30 12:46:32编辑过]
1 d! p- E! T4 o
作者: yzhlinux    时间: 2005-4-30 13:30

你的问题仔细看我上面的答复,说的很清楚了


作者: 游侠无极限    时间: 2005-4-30 17:44

我的意思是这样的

* t& N( n* I1 {0 s' L

myclass.cls(myclass)

4 v8 Q) O6 L- c

public a as integer

2 X& B8 g2 |# |$ i8 W

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 H

dim y as new myclass

# M* M+ a" Z: w% \% x9 ]

'把x复制给y,不要使用引用方式,x,y相对独立,也就是说x改变而不影响y

/ f' D1 h5 Y! R& S$ X/ n

'x是一个已经存在的myclass的实例

* N3 h8 f* i9 k) H) T

y =x

% A2 o: A1 R4 q3 c

'y.a = x.a

& X; e% c, e3 E0 h

'y.b = x.b

! _4 W- s1 E: \$ G% R) \

'我后来想了想可以使用VB的默认属性这个东西

" \6 E4 I' K1 s7 K) x. v
[此贴子已经被作者于2005-4-30 17:45:28编辑过]
, o" I7 w. o- `6 a+ U, \
作者: yzhlinux    时间: 2005-4-30 18:43

很不幸,好像没有这个功能,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