C++ 在C++;

C++ 在C++;,c++,pointers,this,C++,Pointers,This,由于一个数组(std::vector),我想编写一行代码,返回指向此的指针。我曾想过使用一个引用(&this),但没有成功 如果需要任何澄清,请告诉我 编辑:为了澄清我在做什么,我尝试直接使用数组访问对象。像这样:(*ARRAY.at(i))->foo(“bar”)。有些人说不可能做一个指针。如果是这样,我如何使用数组直接访问对象?您不能有指向此的指针,因为它不是变量,而是转换为指向当前对象指针的保留关键字 在编译器实现中,可能存在支持此指针的函数的局部变量,但它是一个实现细节,程序员无法访问它

由于一个数组(
std::vector
),我想编写一行代码,返回指向此
的指针。我曾想过使用一个引用(
&this
),但没有成功

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


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

您不能有指向此
的指针,因为它不是变量,而是转换为指向当前对象指针的保留关键字

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

您试图做的事情非常邪恶,但如果您真的想做,您必须自己创建变量:

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];
}
//假设以相同的方式获取数组中的所有元素:
对于(int i=0;i > p> > C++ <代码> > 不是LValk。因此,无法创建指向此
的指针。出于同样的原因,也不可能将引用直接绑定到
this

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

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

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

编辑:为了澄清我在做什么,我正在尝试访问该对象 直接使用数组。像这样:(*ARRAY.at(i))->foo(“bar”);。一些 人们说做一个指针是不可能的。如果是,我会怎么做 是否使用数组直接访问对象

返回
this
,将其存储在数组中,然后像这样访问:myArray[idx]>foo(“bar”)

同样,
这是指向对象的指针

编辑: 我被纠正了<代码>此
是一个作为隐藏方法参数实现的右值表达式-具有局部变量的生命周期。:)

this指针作为隐藏参数传递给所有非静态 成员函数调用,并且在 所有非静态函数的主体

所以,获取这个指针的地址实际上是毫无意义的

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

void my_struct::my_func(int a);
当您在my_结构上调用它时,编译器会在后台执行以下操作:

void my_struct__my_func(my_struct* this, int a);

鉴于此指针是通过值传递的,获取其地址将为您提供函数返回后将不再存在的内容的地址。

您现在有很多正确答案,但请尝试以不同的方式思考:


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

std::vector
看起来是个非常糟糕的主意。
这是一个指针,特别是指向对象实例的指针。要返回指向
的指针,此
意味着从类外部更改内部实例。那可能很糟糕。你到底在做什么?“我想使用一个引用(
&这个
),但它不起作用。”你是说
*这个
?需要澄清一下。如果你只是想直接使用数组访问它,为什么不能将它放入数组的元素中?somearrayofpointers[0]=此@使用地址运算符(
&
)的lkjoel。它返回当前函数堆栈上指针的地址。@Richard,我尝试过(
&this
),但它给出了一条错误消息:
错误:一元操作数需要左值
@RichardJ.RossIII-否。无法使用&on
this
指针不是l值。它是一个表达式(尽管是一个特殊的表达式),类似于
2+1
。这就像试图计算
&(2+1)
,在这两种情况下,你都会得到相同的错误,一元运算符&的运算符不是l值。任何否决艾薇拉答案的人都不会意识到自己的无知。艾薇拉的回答(就像上面安德烈的回答)是正确的(因此,答案是+1)。谢谢!这回答了我的问题:有趣。为什么它不是一个(常量)左值呢?它看起来确实像一个(它有一个名字和全部)。@Konrad Rudolph:因为当涉及标量类型的右值时,
const
的概念根本不适用。标量类型的右值不能是常量或非常量。请参见3.10/9:“类Rvalue可以具有cv限定类型;非类Rvalue始终具有cv限定类型”。重载赋值运算符定期返回对该
的引用。。。我猜这是一个
右值
?@Andrey我的问题是为什么它不是左值;不是右值。@AJG85