改变这是什么

时间:2011-03-23 07:46:24

标签: c++ pointers this

有没有办法改变这一点?

class foo{...}

foo* fooinstance = new foo();
foo* otherfooinstance = new foo();

void
foo::bar(){
    this = otherfooinstance;
}

fooinstance->bar();

对于那些想知道在什么情况下我会改变这个指针的人来说就是这种情况。我不得不做一个树递归,我必须删除中间节点..对于这个例子,我们假设删除的中间节点有标题d。这些中间节点只有一个子节点。所以在lisp表示法中,如果我们有一个像

这样的树

(g(d(i 4))(i 5))

函数removeIntermediates(tree)实际上会导致上述内容成为

(g(i 4)(i 5))

此IF指针重新分配的伪代码如下所示..

DTREE::removeIntermediates(){
    this = child(0); removeIntermediates();
}

TREE::removeIntermediates(){
    for each child { child->removeIntermediates();
}

我想在不知道子节点是什么的情况下这样做,因此使代码可以在每个节点类型的不同函数中使用,并且具有其他类型的通用函数。 可悲的是,我刚刚做了类似的事情......

TREE::removeIntermediates(){
    for each child { if(child->name == "d") {
        setchild(child->child(0));
        child->removeIntermediates();
    }
    else { child->removeIntermediates();}
}

6 个答案:

答案 0 :(得分:8)

不,this不可修改。

从概念上讲,这没有意义,what are you trying to accomplish

答案 1 :(得分:2)

不,你永远不应该设置this

如果您需要指向不同的对象,请定义自己的变量。

答案 2 :(得分:2)

C++ standard通过声明“关键字this is non-lvalue expression”禁止在“9.3.2 The this pointer”中赋值。虽然,一些编译器仍允许通过使用某个编译时开关来分配,因为在早期草案中的某些时候,C ++标准实际上允许赋值给“this”。

无论如何,很难想象一个你真的想要这样做的情况,并且很可能有一种干净而美丽的方式来做它。

答案 3 :(得分:1)

没有。这是一个右值,而不是左值。最简单的思考方式 它是调用编译器魔术来访问对象 该函数被调用。你不能再修改它了 比你可以修改常数3。

从历史上看,在早期版本的C ++中,您可以进行修改 它,但只在构造函数中,并且只作为第一件事 构造函数:由此提供的功能 由用户定义的运算符new包含。这是20至15年 然而,之前。

你想做什么?如果你只想访问两个 来自同一成员函数的不同对象,那是不 问题:otherfooinstance->应该工作,并会给你 也可以访问私人会员。

答案 4 :(得分:0)

成员方法void foo :: bar(){this = otherfooinstance;将编译如下:

void foo__bar(foo * const this){this = otherfooinstance; }

这个是一个指向调用foo实例的const指针,所以你无法改变它。 并且改变这个不是一个好主意。

答案 5 :(得分:0)

“this”指针实际上并不存在。也就是说,它不会存储在对象的某个地方。相反,当在对象上调用方法时,编译器将对象的地址作为额外参数传递。所以当一个方法正在执行时,“this”才真正出现在堆栈中。

因此,即使您在示例中指定了“this”,您对otherfooinstance的重定向也只会持续当前bar()调用的持续时间。