首页 新闻 会员 周边

如何获取调用方法的实例

0
悬赏园豆:20 [已解决问题] 解决于 2012-09-11 20:25

class A{

  void Method(){

    //do sth.

  }

}

对于上面这个类,我如何知道 调用method 方法的 对象是哪个啊?

如 我创建了两个对象

A a1=new A();

a1.Method();

A a2=new  A();

a2.Method();

我在Method方法里如何知道是a1调用的 还是a2调用的呢?

也就是说 ,我想在Method里面 获取 调用该方法的实例对象,不知道各位看管听明白了没

世界万物的主页 世界万物 | 菜鸟二级 | 园豆:276
提问于:2012-09-11 12:35
< >
分享
最佳答案
0

你可以在方法体里用this获取到当前对象,但是你无法获取到当前对象的“变量名”。举个例子很容易明白:

class A
{
  public void Method()
   {
    //this 代表当前实例
  }
}

在Method()中,this代表当前实例,当前实例是堆上的一个唯一的对象,而在栈上可能有99个变量都指向这个对象。

A a1 = new A();
A a2 = a1;
A a3 = a1;
A a4 = a1;
...
A a99 = a1;
a99.Method();

无论是哪个变量调用Method方法,它们指向的堆上的同一个实例,因此对于Method来说,它们没有不同,因此在Method中的this也没有不同。再从另外一方面来反证,假设你可以输出变量名,那么请问这句的输出是什么:

new A().Method();
收获园豆:20
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-09-11 13:41
其他回答(5)
0

调用该方法的实例就是this啊:

class A{
      public string name;  
  void Method(){
    //do sth.
           Console.Wirte("我是"+this.name);
  }
}

A a1=new A();
a1.name="张三";
a1.Methode();

A a2=new A();
a2.name="李四";
a2.Method();
向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-11 13:06

  你理解错了,楼主的意思是要返回得到 "a1" 或者"a2",当然可以在构造函数里面将a1.name幅值成"a1",这样就可以用this.name查看。但是这样就需要程序员自己写。

  感觉有点像反射机制的逆过程······

  关注···

支持(0) 反对(0) 汪浩瀚 | 园豆:56 (初学一级) | 2012-09-11 13:17

@汪浩瀚: 

不能,没有必要知道变量名叫什么,变量名是可以变的,可能被编译器改掉,可能指向另外一个对象,能取到引用就行了。

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-11 13:47
0

可以看下那个clr via c#

chenping2008 | 园豆:9836 (大侠五级) | 2012-09-11 13:09
0

class A{

  void Method(){

    this // 这就是调用该方法的实例,但是没有办法知道该实例是 a1 还是 a2.

  }

}

Launcher | 园豆:45045 (高人七级) | 2012-09-11 13:12
0

好像不能实现吧,我写了一段代码,写的不好请不要笑我,我是一个菜鸟,可以参考一下:

#include <iostream>
using namespace std;

class A
{
public:
    A(){ type = 0;};
    virtual ~A(){};

public:
    void myFun();
    void setType(char type);

private:
    char type;
};

void A::myFun()
{
    switch(type)
    {
    case 1:
    {
        //do a1 sth;
        break;
    }
    case 2:
    {
        //do a2 sth;
        break;
    }
    default:
        break;
    }
}
int main(int argc, char **argv) {

    A a1 = new A();
    a1.setType(1);
    a1.myFun();
    A a2 = new A();
    a2.setType(2);
    a2.myFun();
    return 0;
}

励志 | 园豆:220 (菜鸟二级) | 2012-09-11 13:16

我现在很赞成Launcher回答的观点,我试了一下将对象的地址打印了,这样是可以的,哇我也长知识了。

void myFun(void)

{
  cout << this << endl;//显示两个对象调用的实例对象的地址

}

 

回头看看我写的程序感觉我理解错了。

支持(0) 反对(0) 励志 | 园豆:220 (菜鸟二级) | 2012-09-11 13:33
0

确实没这个必要,楼主需要换一个思路解决问题。

君之蘭 | 园豆:230 (菜鸟二级) | 2012-09-11 15:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册