访问隐藏的'this'指针

Kyl*_*yle 1 c++ callback this event-handling

我有一个GUI架构,其中元素像这样触发事件:

guiManager->fireEvent(BUTTON_CLICKED, this);
Run Code Online (Sandbox Code Playgroud)

每个被触发的事件都将'this'传递给事件的调用者.从未有一个时间,我希望通过"这个",而且,没有指针,除了为"本"应该永远传递.

这给我带来了一个问题:我如何断言fireEvent永远不会被赋予除'this'以外的指针,我如何简化(和均质化)对fireEvent的调用:

guiManager->fireEvent(BUTTON_CLICKED);
Run Code Online (Sandbox Code Playgroud)

在这一点上,当你写这样的东西时,我想起了一个相当常见的编译器错误:

class A {
public:
    void foo() {}
};

class B {
    void oops() { const A* a = new A; a->foo(); }
};

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译这将给你

在成员函数'void B :: oops()'中:错误:将'const A'作为'void A :: foo()'的'this'参数传递,丢弃限定符

因为成员函数将'this'作为隐藏参数传递.

"啊哈!" 我说.这(没有双关语)正是我想要的.如果我能以某种方式访问​​隐藏的'this'指针,它将解决我之前提到的两个问题.问题是,据我所知你不能(可以吗?),如果可以的话,会有一些"但它会破坏封装!" 除了我每次都已经传递'这个',所以它还能破坏它.

那么,没有办法访问隐藏的'this',如果没有,是否有任何习惯用法或替代方法比每次传递'this'更优雅?

Jes*_*der 6

你可以定义

void Element::fireEvent(EVENT e) {
   guiManager->fireEvent(e, this);
}
Run Code Online (Sandbox Code Playgroud)

每次都要节省一些自己的写作.你将不得不this某个时候调用它,因为guiManager需要知道哪个ElementfireEvent.