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-否。无法使用&onthis
。此
指针不是l值。它是一个表达式(尽管是一个特殊的表达式),类似于2+1
。这就像试图计算&(2+1)
,在这两种情况下,你都会得到相同的错误,一元运算符&的运算符不是l值。任何否决艾薇拉答案的人都不会意识到自己的无知。艾薇拉的回答(就像上面安德烈的回答)是正确的(因此,答案是+1)。谢谢!这回答了我的问题:有趣。为什么它不是一个(常量)左值呢?它看起来确实像一个(它有一个名字和全部)。@Konrad Rudolph:因为当涉及标量类型的右值时,const
的概念根本不适用。标量类型的右值不能是常量或非常量。请参见3.10/9:“类Rvalue可以具有cv限定类型;非类Rvalue始终具有cv限定类型”。重载赋值运算符定期返回对该
的引用。。。我猜这是一个右值?@Andrey我的问题是为什么它不是左值;不是右值。@AJG85