Sie können nicht.
Erstens ist this
nicht unbedingt eine const Foo *
. this
wäre eine const Foo *
ist eine Const-Methode der Klasse Foo
. Bei einer nicht-konstanten Methode ist this
nur Foo *
. (Ihre Fehlermeldung erwähnt eigentlich Foo* const
. Wo haben Sie gesehen const Foo *
?)
Zweitens, und noch wichtiger, this
ist kein Lvalue. Sie können keinen Zeiger auf this
haben. Sie können keinen nicht konstanten Verweis auf this
haben. Das einzige, was Sie haben können, ist eine konstante Verehrung gegenüber this
, d.h. eine Referenz des Typs Foo *const &
.
Es (Foo *const &
) wird in Ihrem Fall funktionieren.
void do_baz(Foo* const& pFoo) {
pFoo->p_sub_foo = new Foo;
}
Aber ich sehe nicht den Sinn von allem. erklären nur einen normalen Foo *
Zeiger als Parameter für Ihre do_baz
Methode
void do_baz(Foo* pFoo) {
pFoo->p_sub_foo = new Foo;
}
und das gleiche Ergebnis. Wofür brauchen Sie diese Referenz?
EDIT: Unter Berücksichtigung Ihrer bearbeiten, was Sie mit einem einzigen do_baz
Funktion, da im ersten Aufruf getan werden kann, nicht zu tun versuchen würden Sie möglicherweise (semantisch) Versuch this
, zu modifizieren, was unmöglich ist (auch wenn der modifizierende Code niemals in der Praxis ausgeführt wird). Ob Sie es wollen oder nicht, Sie können keinen nichtkonstanten Verweis auf this
haben, auch wenn Sie nicht vorhaben, etwas damit zu schreiben. Sie werden wahrscheinlich den ersten Anruf mit einer anderen Funktion
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
}
und dann den ersten Anruf implementieren müssen, um als
void bar() {
do_baz_root(this);
}
nur loswerden der &. –