今天写一个东西,竟然不能访问自己的 private 成员!郁闷……请各路高手帮帮忙。=======================================
下面是源代码,编译没有任何错误和警告:unit XxxUnit;interfacetype
  TMyClass = class
  private
    b: boolean;
  public
    function isB: boolean;
    procedure setB(bb: boolean);
  end;var
  MyClass: TMyClass = nil;implementationfunction TMyClass.isB: boolean;
begin
  result := b;
end;procedure TMyClass.setB(bb: boolean);
begin
  b := bb;
end;end.======================================
下面是在一个 Form 里,找个按钮写的代码:....uses ..... XxxUnit;....procedure ...... ;
begin
  MyClass := TMyClass.Create;
  MyClass.setB(true); { 这里没有问题 }  MyClass.getB; { 妈的,这里就出问题了 }
end;=============================================出现 “Access violation at address xxxxxxx”的错误。然后调试代码,追踪到 “result := b;”这一行就错误了。然后 Add Watch,对 b 查看,那个 Watch List 窗口里面竟然出现:“b: Inaccessiable value”!各路大侠帮忙,成员函数竟然不能访问自己的 private 成员,天理何在!:~(注: Delphi 6 下运行。

解决方案 »

  1.   

    莫名其妙,上面类定义中哪里有GetB这个函数!?我只看到一个IsB函数哦!另外为什么要在申明对象指针的时候给他一个初始值,你是认为他为全局的,内容不定吗?
      

  2.   

    哦,错了,我程序上调用是写 isB 的,这里我简化了程序,好贴上来看,造成了 isB 和 getB 的笔误。另外,如果两处统一确实是不行的!不信可以试一下
      

  3.   

    如果没有 getB,程序编译是不可能通过的,是化简代码的时候出错了,但原来的程序绝对没有问题,否则编译不能通过。
      

  4.   

    不可能吧,你既然调用SetB没有问题就说明可以访问那个私有变量了上面那些是你全部的代码吗?在调用SetB和IsB之间没有其他代码吗?
      

  5.   

    为了做这个试验,我拿掉了 setB 和 isB 之间的全部代码,一样出现这个错误!
      

  6.   

    你把申明MyClass那里的赋值去掉看看,但按道理这里应该不会有问题的!
      

  7.   

    个人感觉应该是你得MyClass被你释放了得原因吧。或者其他对象被释放了。
      

  8.   

    个人感觉应该是你得MyClass被你释放了得原因吧。或者其他对象被释放了。
      

  9.   

    顺便提一个问题:procedure .....
    begin
      result := TMyClass.Create;
    end;这个东西会不会在 procedure 范围外被 destroy 掉?
      

  10.   

    那么怎么能在 function 里面 create 对象,传到函数外面去?
      

  11.   

    procedure .....
    begin
      result := TMyClass.Create;
    end;这个东西不会在 procedure 范围外被 destroy 掉
      

  12.   

    sorry,想当然了,这样做不应该在出了过程后被释放掉
      

  13.   

    那么就是说,不能在 function 里面 Create 对象,然后返回了?真的一点办法也没有吗?
      

  14.   

    function tttt(....):Tmyclass;
    begin
      result := TMyClass.Create;
    end;
      

  15.   

    那么为什么我的那个东西会出现 AV 错误?
    我刚才调试了一阵子,发现 Create 、setB、isB 写在同一个函数内,则不会有错误,如果 Create 是另外处理,那么就会出现 AV 错误(我保证 Create 在 setB、isB 前调用)。
      

  16.   

    偶机器上的Delphi用不了,你等一下!
      

  17.   

    procedure…………
    var
      m:boolean;
    begin
      MyClass := TMyClass.Create;
      MyClass.setB(true); { 这里没有问题 }
      m:=MyClass.isB; { 妈的,这里就出问题了 }
      showmessage(inttostr(ord(m)));
    end;
    我的返回结果是1,你的机器有问题吧??
      

  18.   

    unit unit2;interfacetype
      TMyClass = class
      private
        b: boolean;
      public
        function IsB: boolean;
        procedure SetB(bb: boolean);
      end;var
      MyClass: TMyClass = nil;implementationfunction TMyClass.IsB: boolean;
    begin
      result := b;
    end;procedure TMyClass.setB(bb: boolean);
    begin
      b := bb;
    end;end.
    -------------
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyClass := TMyClass.Create;
      MyClass.SetB(true); { 这里没有问题 }  MyClass.IsB; { 妈的,这里就出问题了 }
      showmessage(inttostr(ord(MyClass.IsB)));
    end;
    ------------
    没有问题呀
      

  19.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyClass := TMyClass.Create;
      MyClass.SetB(true); { 这里没有问题 }  MyClass.IsB; { 妈的,这里就出问题了 }
      showmessage(inttostr(ord(MyClass.IsB)));
      Button2Click(nil);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if Assigned(MyClass) then
      begin
      MyClass.Free;
      ShowMessage('结束');
      end;
    end;
    -------------
    MyClass相当于unit1中的全局变量,在退出Button1Click过程之后,MyClass对象并没有释放,但可以在别的地方释放
      

  20.   

    unit unit2;interfacetype
      TMyClass = class
      private
        fb: boolean;
      public
        function IsB: boolean;
        //procedure SetB(true);
      published
        property b: boolean read fb write fb;  
      end;var
      MyClass: TMyClass = nil;implementationfunction TMyClass.IsB: boolean;
    begin
      result := fb;
    end;//procedure TMyClass.setB(bb: boolean);
    //begin
    //  b := bb;
    //end;end.
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyClass := TMyClass.Create;
      //MyClass.SetB(true); { 这里没有问题 }
      MyClass.b:= true;
      MyClass.IsB; { 妈的,这里就出问题了 }
      showmessage(inttostr(ord(MyClass.IsB)));
    end;
      

  21.   

    向这种访问变量的,可用property来实现,这可是delphi的著名的特性
      

  22.   

    procedure CreateSomeObject(SomeClass:TSomeClass,var SomeObject)
    begin
      SomeObject:=TSomeClass.create;
    end;注意,一定要有var关键字。//var SomeObject
      

  23.   

    笔误。应该是下面这样。
    procedure CreateSomeObject(SomeClass:TSomeClass,var SomeObject)
    begin
      SomeObject:=SomeClass.create;
    endSomeClass是类引用。
      

  24.   

    没问题,调试了,重起一下机器吧,实在不行
    重装delphi
      

  25.   

    procedure ...... ;
    begin
      MyClass := TMyClass.Create;
      MyClass.setB(true); { 这里没有问题 }  MyClass.isB; { 妈的,这里就出问题了 }
    end;
    我做也不出问题呀。
    是否有这种可能,是你程序中的其他地方的一个非法操作(如越界)破坏了b的值?
      

  26.   

    oh my gosh,这个问题早该揭贴了