下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 4149|回复: 10
打印 上一主题 下一主题

VB问题之二……

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-4-29 14:42:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果返回一个类模块类型?1 [4 c2 i/ O& S
比如工程中有一类模块:(其实就是作为一个自定义的数据类型)
9 p8 V* g5 {+ e( h' emystruct.cls. P! V9 y7 g7 X4 ?* O/ @
public dd as integer
; p8 [8 a; d. c7 w, ~' _# ]public ss as string* [5 }2 b8 n2 @! g3 l1 }4 ^
5 Q! {, c9 i3 e9 R; N- X: _
想要在另一个类模块中实现这个一个函数2 S2 U2 W6 c* Z
public function GetData() as mystruct4 z" }0 z' G- h& C" `8 N+ G6 j# q
怎么做??
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    2
    发表于 2005-4-29 15:16:00 | 只看该作者

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

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

    function GetData() as mystruct

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

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

    end function

  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    3
    发表于 2005-4-29 15:18:00 | 只看该作者

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

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

    dim dodo as new mySecondStruct '这里要nwe

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

    该用户从未签到

    4
     楼主| 发表于 2005-4-29 15:56:00 | 只看该作者

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

    多谢了

  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    5
    发表于 2005-4-29 21:37:00 | 只看该作者
    我知道你应该是对 set 的使用有不理解,所以后来特意加上“对于类也就是 *.cls  中定义的模块,一定要记得用 set” 这个。
    - ]/ u% K1 F( [$ v“也就是说 set  传递一个引用,和C++中的引用类似” 你可以这么理解,但是你要记住,其本质并不是这样,反而 ,和C++中的引用是完全不同,没有任何类似的地方,set 起底层的实现机制肯定是 com 的原理,起保持引用而不释放new出来的东西是因为计数的问题,而 set 就是处理计数的地方。和 com 中的 AddRef 到是类似。

    该用户从未签到

    6
     楼主| 发表于 2005-4-29 23:19:00 | 只看该作者
    set xx =nothing 就是减少一次引用?
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2005-4-30 00:03:00 | 只看该作者

    是的,完全正确!

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

    该用户从未签到

    8
     楼主| 发表于 2005-4-30 12:14:00 | 只看该作者

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

    5 F( J+ r* D% l1 F0 s

    dim a as new class1

    . J( A! A6 R) c* D

    dim b as new class1

    % U& I5 P* E# \" p+ Z! U

    a.init(xxxxxx,xxxx,xxxx)

    8 K1 E. R8 h* R8 ^4 k9 s4 P+ `

    b = a '错误

    : a$ }" {0 b- V7 i* R

    或者是不是有什么关于类的VB函数用来复制?

    5 Y( P& J# E( x& U8 I/ n, c或者说VB的类的复制函数要自己写8 W" e* \% f( Y. m% A0 e7 F
    [此贴子已经被作者于2005-4-30 12:46:32编辑过]
    3 g- n5 q$ K d0 L$ q( L& k% G
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2005-4-30 13:30:00 | 只看该作者

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

    该用户从未签到

    10
     楼主| 发表于 2005-4-30 17:44:00 | 只看该作者

    我的意思是这样的

    - _, u. S# l/ ~! m0 A4 ^/ k

    myclass.cls(myclass)

    ) \# I" d7 q0 k7 o! J0 b+ E

    public a as integer

    4 e- ]" L( J4 N( f. t# H$ \

    public b as string

    ! B" X8 ^0 d4 {" H' F1 ~, V

    --------------------------------------------

    / k6 N, s& n8 y! }+ {

    然后在使用中

    , `. S2 b; j' K; P- M; B

    dim y as new myclass

    " X5 ^3 l( j( _2 K: G- A

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

    $ l% i0 m$ ]3 [4 [. O0 ~

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

    9 V4 S( l3 G8 C; G9 n

    y =x

    - R2 I$ ~6 j6 w* m2 C

    'y.a = x.a

    & S3 w" j. K: h+ l: c5 L# R- H" ?$ k

    'y.b = x.b

    # |( S% g* K3 z) C* `6 _9 I) _

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

    ) H3 p9 U. U) }' l- A
    [此贴子已经被作者于2005-4-30 17:45:28编辑过]
    : g: h# A+ x" }7 [/ Z
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    11
    发表于 2005-4-30 18:43:00 | 只看该作者

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

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表