VB问题之二……
如果返回一个类模块类型?比如工程中有一类模块:(其实就是作为一个自定义的数据类型)
mystruct.cls
public dd as integer
public ss as string
想要在另一个类模块中实现这个一个函数
public function GetData() as mystruct
怎么做?? <P>你不都写出来了吗??还问什么?</P><P>在另外一个模块里写一个函数</P><P>function GetData() as mystruct</P><P>dim tpreturn as new mystruct'这里一定要 new 因为 tpreturn是要实际存在的要返回的</P><P>set GetData = tpreturn'这样其他地方调用了GetData以后就得到了 tpreturn 同性质的类(或者结构)</P><P>end function</P> <P>对于类也就是 *.cls中定义的模块,一定要记得用 set ,在返回函数中也一样</P><P>dim tp as mystruct '这里不需要new,因为下面我会赋值</P><P>dim dodo as new mySecondStruct '这里要nwe</P><P>set tp = dodo.GetData() '这里赋值了,但是要记得用 set </P> <P>也就是说 set传递一个引用,和C++中的引用类似</P><P>多谢了</P> 我知道你应该是对 set 的使用有不理解,所以后来特意加上“对于类也就是 *.cls中定义的模块,一定要记得用 set” 这个。
“也就是说 set传递一个引用,和C++中的引用类似” 你可以这么理解,但是你要记住,其本质并不是这样,反而 ,和C++中的引用是完全不同,没有任何类似的地方,set 起底层的实现机制肯定是 com 的原理,起保持引用而不释放new出来的东西是因为计数的问题,而 set 就是处理计数的地方。和 com 中的 AddRef 到是类似。 set xx =nothing 就是减少一次引用? <P>是的,完全正确!</P><P>记住 类在vb下是特殊的,所有 set a = b 其实都是同一个对象,set a=nothing 只是减少一个计数,并不是真正让这个对象消失了,这和c是不同的,</P><P>我继续多说一点,这点是很多vb高手都弄不清楚的(因为他们并不知道什么是对象的本质,也就是没有很好的C++基础),在vb中对象的传递统统是按址的(byref)即使你指明按值 (byval),那也不是真正的按值,传过去的还是地址的值(用c的话就是本质还是传的指针)</P><P>详细举例如下: </P><P>'1 执行了下面的语句以后,其实 a,b,c,d 都是同一个对象,这就是我前面说的引用计数</P><P>set a=b:set c=b :set d = a </P><P>'2 清除的问题</P><P>set a=nothing:set b=nothing:set c=nothing ' 这个时候 a,b,c 都是nothing , 但是对象并没有真正删除,d 还是存在的</P><P>set d =nothing ‘这个时候对象没有了,因为计数为0了,所以发现是0的时候就真正的清楚了内存了。</P><P>'3 类做为参数的时候的问题</P><P>sub test1(byval tp class1)</P><P>tp.num=tp.num+1</P><P>end sub</P><P>'其实和</P><P>sub test2(byref tp class1)</P><P>tp.num=tp.num+1</P><P>end sub</P><P>'表现起来没有什么不同</P><P>dim tp1 as new class1</P><P>dim tp2 as new class1</P><P>tp1.num=0:tp2.num=0</P><P>call test1(tp1):call test2(tp2) </P><P>'这个时候tp1 和 tp2 的num 都是1,也就是说byval和 byref 一样,传入的类在函数内部变化以后,类也就变化了(当然,因为根本就是同一个类,不管你byval还是byref)</P> <P>看来VB也真够麻烦的,还有就是VB好像不能直接进行类的COPY,如</P>
<P>dim a as new class1</P>
<P>dim b as new class1</P>
<P>a.init(xxxxxx,xxxx,xxxx)</P>
<P>b = a '错误</P>
<P>或者是不是有什么关于类的VB函数用来复制?</P>
或者说VB的类的复制函数要自己写
[此贴子已经被作者于2005-4-30 12:46:32编辑过]
<P>你的问题仔细看我上面的答复,说的很清楚了</P> <P>我的意思是这样的</P>
<P>myclass.cls(myclass)</P>
<P>public a as integer</P>
<P>public b as string</P>
<P>--------------------------------------------</P>
<P>然后在使用中</P>
<P>dim y as new myclass</P>
<P>'把x复制给y,不要使用引用方式,x,y相对独立,也就是说x改变而不影响y</P>
<P>'x是一个已经存在的myclass的实例</P>
<P>y =x</P>
<P>'y.a = x.a</P>
<P>'y.b = x.b</P>
<P>'我后来想了想可以使用VB的默认属性这个东西</P>
[此贴子已经被作者于2005-4-30 17:45:28编辑过]
<P>很不幸,好像没有这个功能,vb天生就不支持自动构造。</P><P>a=b 这个对于类是不行的,如果想实现你复制的要求,那只有你自己写代码了,其实也就是成员数据拷贝</P><P>你可以笨办法 :</P><P>a.p1=b.p1</P><P>a.p2=b.p2</P><P>.</P><P>.</P><P>.</P><P>如果你的经常要做类间的复制操作,那么就在类中写一个复制函数</P><P>function CopyMyClass(src as myclass)</P><P>a.p1=b.p1:a.p2=b.p2 : ...</P><P>end function</P><P>然后使用的时候就可以 a.CopyMyClass(b)</P>
页:
[1]