3

this由于数组(std::vector<foo**>) ,我想编写一行代码返回指向 的指针。我想过使用引用(&this),但它没有用。

如果需要任何澄清,请告诉我。

编辑:为了澄清我在做什么,我试图直接使用数组访问对象。像这样:(*ARRAY.at(i))->foo("bar");。有人说做指针是不可能的。如果是这样,我将如何使用数组直接访问对象?

4

5 回答 5

10

您不能有指向 的指针this,因为它不是变量,它是一个保留关键字,可转换为指向当前对象的指针。

在编译器实现中,可能有一个支持this指针的函数的局部变量,但它是一个实现细节,程序员无法访问其地址。

你试图做的是非常邪恶的,但如果你真的想这样做,你将不得不自己创建变量:

foo** evil_ptr_to_ptr = new foo*(this);
ARRAY.push_back(evil_ptr_to_ptr);

并且在将来的某个时候,您将不得不将其删除:

// assuming you got all the elements in the array in the same way:
for(int i = 0; i < ARRAY.size(); ++i) {
  delete ARRAY[i];
}
于 2012-07-02T18:29:04.590 回答
4

在 C++this中不是左值。因此,无法创建指向this. 出于同样的原因,也不可能将引用直接绑定到this.

于 2012-07-02T18:33:09.627 回答
2

this 指针作为隐藏参数传递给所有非静态成员函数调用,并可作为所有非静态函数体内的局部变量使用。

因此,获取 this 指针的地址实际上是没有意义的。

考虑这个非静态成员函数:

void my_struct::my_func(int a);

当您在 my_struct 上调用它时,编译器会在后台执行此操作:

void my_struct__my_func(my_struct* this, int a);

鉴于 this 指针是按值传递的,获取它的地址将为您提供函数返回后将不再存在的地址。

于 2012-07-02T18:40:39.593 回答
0

正如其他回复/评论指出的那样,this它本身就是一个指针。

即使您可以使用指向this:的指针,this它也是一个局部变量,是您正在运行的方法的局部变量,并且它是指向您正在使用的对象的指针。

返回指向的指针this与返回指向任何其他局部变量的指针具有相同的效果:它将返回垃圾,因为您刚刚离开了this定义的范围。

编辑:为了澄清我在做什么,我试图直接使用数组访问对象。像这样:(*ARRAY.at(i))->foo("bar");。有人说做指针是不可能的。如果是这样,我将如何使用数组直接访问对象?

Return this,将其存储在您的数组中,然后像这样访问: myArray[idx]->foo("bar")

同样,this指向您的对象的指针。

编辑:我的立场得到纠正。this是作为隐藏方法参数实现的右值表达式 - 它具有局部变量的生命周期。:)

于 2012-07-02T18:39:14.650 回答
0

你现在有很多正确的答案,但试着换个角度想一想:

foo假设您在内存中的某个地址分配了您的类的对象。此地址this在您的班级范围内有效地表示为。现在,你说你需要另一个地址来保存原始对象的地址。这个变量必须被声明并且拥有你的对象的生命周期;显然,默认情况下不存在这样的变量,因为创建一个变量没有太大意义。如果要保留foo**在容器中,则很可能必须保留另一个容器foo*,因此前者可以指向后者。好吧,再一次,这样做很可能没有意义,我想你应该以不同的方式解决你的问题?(您可能想在 SO 上提出问题并获得一些帮助。)

于 2012-07-02T18:46:11.880 回答