class A{
void Method(){
//do sth.
}
}
对于上面这个类,我如何知道 调用method 方法的 对象是哪个啊?
如 我创建了两个对象
A a1=new A();
a1.Method();
A a2=new A();
a2.Method();
我在Method方法里如何知道是a1调用的 还是a2调用的呢?
也就是说 ,我想在Method里面 获取 调用该方法的实例对象,不知道各位看管听明白了没
你可以在方法体里用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();
调用该方法的实例就是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();
你理解错了,楼主的意思是要返回得到 "a1" 或者"a2",当然可以在构造函数里面将a1.name幅值成"a1",这样就可以用this.name查看。但是这样就需要程序员自己写。
感觉有点像反射机制的逆过程······
关注···
@汪浩瀚:
不能,没有必要知道变量名叫什么,变量名是可以变的,可能被编译器改掉,可能指向另外一个对象,能取到引用就行了。
可以看下那个clr via c#
class A{
void Method(){
this // 这就是调用该方法的实例,但是没有办法知道该实例是 a1 还是 a2.
}
}
好像不能实现吧,我写了一段代码,写的不好请不要笑我,我是一个菜鸟,可以参考一下:
#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;
}
我现在很赞成Launcher回答的观点,我试了一下将对象的地址打印了,这样是可以的,哇我也长知识了。
void myFun(void)
{
cout << this << endl;//显示两个对象调用的实例对象的地址
}
回头看看我写的程序感觉我理解错了。
确实没这个必要,楼主需要换一个思路解决问题。