我刚刚发现了一些与我所了解的语言相矛盾的东西。让我们从以下状态开始:
this
指针的类型为:Class* const
因此,如果未注释,下面的代码将无法编译:
class Foo{
public:
Foo* getPtr(){
return this;
}
private:
int m_id;
};
int main(int argc, char **argv)
{
Foo foo;
Foo* fooPtr = foo.getPtr();
// fooPtr->m_id; Won't compile
}
this
指针可以像常规指针一样传递给函数,对吗?
那么,当将this
指针作为参数传递给静态函数回调时,为什么可以通过class Stomach{
public:
using OnDigested = void (*)(void* userData);
void StartEating(void* userData){
timer(std::chrono::seconds(1), m_onDigested, userData);
}
void SetOnDigested(OnDigested onDigested) {
m_onDigested = onDigested;
}
private:
OnDigested m_onDigested;
};
class Animal{
public:
Animal(std::string specie){
m_specie = specie;
}
void StartLeave(){
m_stomach.SetOnDigested(OnDigested);
m_stomach.StartEating(this);
}
private:
static void OnDigested(void* userData){
Animal* animal = static_cast<Animal*>(userData);
std::cout << "Every eaten tiger makes me wonder who I am.."
" I must be a: " << animal->m_specie << std::endl;
// std::string specie = m_specie; //Won't compile
}
Stomach m_stomach;
std::string m_specie;
};
int main(int argc, char **argv)
{
Animal mammoth("Mammoth");
mammoth.StartLeave();
return 0;
}
指针访问私有数据呢?语言允许什么规则?
userData
上面的代码编译并打印“ Every eated ...”。
我知道对m_specie成员的调用是从Animal类完成的,而不是从Animal类的实例(静态函数)完成的。我假设当使用{{1}}传递this指针时,它可以用作任何其他指针(不访问私有成员)