将"this"转换为引用指针

Aus*_*yde 5 c++ pointers reference

假设我有一个结构

struct Foo {
    void bar () {
       do_baz(this);
    }
    /* See edit below
    void do_baz(Foo*& pFoo) {
       pFoo->p_sub_foo = new Foo; // for example
    }
    */

    Foo* p_sub_foo;
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会告诉我

temp.cpp: In member function ‘void Foo::bar()’:
temp.cpp:3: error: no matching function for call to ‘Foo::do_baz(Foo* const)’
temp.cpp:5: note: candidates are: void Foo::do_baz(Foo*&)
Run Code Online (Sandbox Code Playgroud)

所以,我怎么转换什么似乎是一个const Foo*Foo*&

编辑:我没有用一个很好的例子.do_baz应该读

void do_baz(Foo*& pFoo) {
    if (pFoo == NULL) {
        pFoo = new Foo;
        return;
    }
    //other stuff
    do_baz(pFoo->p_sub_foo);
    //more stuff
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 7

你不能.

首先,this不一定是const Foo *.this将是一个const Foo *类的const方法Foo.在非const方法this中就是这样Foo *.(实际上你的错误信息提到了Foo* const.你在哪里看到的const Foo *?)

其次,更重要的this是,不是左值.你不能指向this.你不能有一个非常量的引用this.你唯一可以拥有的是对它的崇敬this,即类型的引用Foo *const &.

它(Foo *const &)将适用于您的情况.

void do_baz(Foo* const& pFoo) { 
   pFoo->p_sub_foo = new Foo;
} 
Run Code Online (Sandbox Code Playgroud)

但我没有看到这一切的重点.只需将普通Foo *指针声明为do_baz方法的参数即可

void do_baz(Foo* pFoo) { 
   pFoo->p_sub_foo = new Foo;
} 
Run Code Online (Sandbox Code Playgroud)

并得到相同的结果.你认为你需要什么参考?

编辑:考虑到你的编辑,你想要做的事情不能用一个do_baz函数来完成,因为在第一次调用你可能(语义上)尝试修改this,这是不可能的(即使修改代码永远不会在实践中执行).无论你是否想要它,你都不能有非const引用this,即使你不打算通过它写任何东西.您可能必须使用不同的函数实现第一个调用

void do_baz(Foo*& pFoo) { 
  if (pFoo == NULL) { 
    pFoo = new Foo; 
    return; 
  } 
  //other stuff 
  do_baz(pFoo->p_sub_foo); 
  //more stuff 
} 

void do_baz_root(Foo* pFoo) { 
  assert(pFoo != NULL);
  //other stuff 
  do_baz(pFoo->p_sub_foo); 
  //more stuff 
} 
Run Code Online (Sandbox Code Playgroud)

然后拨打第一个电话

void bar() {
  do_baz_root(this);
}
Run Code Online (Sandbox Code Playgroud)

  • @Austin Hyde:对不起,但从C++的角度来看,这没有任何意义.你不能改变'this`."这个"不可改变.您试图通过试图改变"this"的代码实现什么? (3认同)