在静态成员函数中访问“ this”指针的私有成员

时间:2019-11-30 17:10:48

标签: c++ c++11

我刚刚发现了一些与我所了解的语言相矛盾的东西。让我们从以下状态开始:

    类的
  • 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指针时,它可以用作任何其他指针(不访问私有成员)

0 个答案:

没有答案