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)
你不能.
首先,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)