类的Create函数调用一个类中定义的函数,函数实现过程中要求调用该类创建的对象的地址,不知是否可以实现?
如定义类 
TTest = class;
private
  Procedure FuncOne;
Public
  Constructor Create;
End;
......MyTest:TTest;
MyTest:=TTest.Create;
其中Create函数内调用了FuncOne,FuncOne要求调用MyTest的地址,不知道有什么办法可以实现?望指教!!

解决方案 »

  1.   

    我的理解:self取的应该是类自身的地址,这样取不到对象的地址!
    这样取的时候,每次创建新的对象时引用Self取的地址是不变的!
      

  2.   

    本程序中调用对象的地址并不是在对象创建完成后调用,而是在Create函数中调用!
      

  3.   


    SELF.自身私有变量 怎么能根据创建不同的实例得到不同的值呢?SELF应该代表实例
      

  4.   

    self有2个含义 一个是Class Self 一个 Object Self,通过类的实例调用非静态方法,这些方法中的Self就是每个实例的地址(可能是VMT的地址,太久不弄Delphi不是很记得了),这是由编译器完成的隐含传递的参数,对于静态方法来说Self就不是指实例的地址了,应该是类的元类型存储的地址(也是我想的)
    很久没碰Delphi,有不对的地方希望大家指教。
      

  5.   

    在类的Create中调用Self的话应该是指向类的VMT地址的,现在我想在Create里取实例的地址,还是没办法!
      

  6.   

    你有些面向对象的概念没有理解清楚:
    类没有实例化时不可能知道其实例的地址,类实例化为对象后,其地址当然会因不同的对象地址而不同的。在类的方法中,self即表示该对象的地址,如果是类方法(以Class开头),self代表类本身(VMT地址)。
      

  7.   

    PTest = ^TTest;
    TTest = class;
    private
      Procedure FuncOne;
    Public
      Constructor Create;
    End;Procedure TTest.FuncOne
    var
      PTmp:PTest;
    begin
      PTmp:=PTest(@Self);
    end;Constructor TTest.Create(...);
    begin
      inherited Create;
      FuncOne;
    end;
    ......MyTest:TTest;
    MyTest:=TTest.Create;
    如上面类Create中调用了FuncOne,FuncOne取对象实李例的地址,但是现在测试出来每次创建新的对象实例取回来的都是同一地址,我认为这里的Self取的是类的地址,不知道问题在哪里?现在要取对象地址.上面这段代码该如何修改?
      

  8.   

    个人理解同意楼上的,self应该是指向对象的。
    什么是vmt??页内地址??
      

  9.   

    PTest = ^TTest;
    TTest = class;
    private
      Procedure FuncOne;
    Public
      Constructor Create;
    End;Procedure TTest.FuncOne
    var
      PTmp:PTest;
    begin
      PTmp:=PTest(@Self);
    end;
    你定义了一个指向对象的指针?受C++影响太严重了。
    self既为指针(指向对象实例),@self为self变量本身的地址(指向指针的指针)
    要显示self的地址很容易:
    ShowMessage(Inttostr(Integer(self)));
      

  10.   

    谢谢步青云,定义指向对象的指针应该没问题吧,我一直都是这么用的,因为程序中同一个类会有很多不同的对象,为了方便对象间的索引,所以定义了指向对象的指针.如果FuncOne要修改,也只是把PTmp:=PTest(@Self)改成PTmp:=PTest(Self),这样修改的结果是我不能通过PTmp^访问对象的成员了(Inaccessible value)
      

  11.   

    可这样定义对象数据:
    var
      ObjArr:array of TMyClass;
    尽量使用ObjectPascal的语法
      

  12.   

    1、楼主混淆了一个概念:指针和指针所指内容二者的地址。这两个地址是不同的。比如执行:
    var
      MyTest: TTest;
    begin
      MyTest := TTest.Create;
    后,MyTest是一个指针,指向TTest.Create生成的一个实例。Integer(MyTest)得到的是MyTest变量本身的地址,指针也是一个数据,需要一个地方存储;而Create方法中的Integer(Self)表示实例的地址(因为Create不是“class function”式的普通类方法,否则则表示类引用地址,及VMT地址)。
    2、因此楼主所说“FuncOne要求调用MyTest的地址”,应该是表达的错误,真正的意思是得到TTest.Create生成的实例的地址对不对?
    3、要得到实例地址,Integer(Self)就可以了。至于:
    var
      PTmp:PTest;
    begin
      PTmp:=PTest(@Self);
    end;
    (1)的确没有必要用^Test,当然用了也没错误。
    (2)楼主可能发现每次执行时Integer(PTmp)的值都不变。为什么呢?因为Integer(PTmp)得到的是变量PTmp的地址,而不是它所指向的对象实例的地址。