强制访问私人会员

man*_*sdf 8 c++ windows visual-c++ c++17

假设我使用的是一个不知道自己做得如何的人的开源库。(没有封装重要成员)确实是我的同事,不允许我修改其代码,也不愿意为我修改它。

我如何在不执行伪造类或修改原始类的操作的情况下强制访问私有成员?

我已经尝试过类似的东西#define private public,但是类文件包含一些标准的名称空间文件,这会产生编译错误。

我已经尝试了内存操作,但这需要成员标识,但无法使用。(请参阅以下内容)

#define PX_ACCESS_PRIVATE( pObject, _Member ) ( static_cast< std::size_t >( pObject ) + static_cast< std::size_t >( &( ( decltype( pObject )( nullptr ) )->_Member ) ) )
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Sto*_*ica 14

哦,您可以光荣地破坏封装。类型系统存在漏洞,可以利用这种漏洞。模板的显式实例化不对其参数进行访问检查。你可以在那里传递任何东西。所以有点管道...

template<typename Tag>
struct contraband_ {
    using type = typename Tag::type;
    inline static type ptr;
};

template<typename Tag>
inline auto const contraband = contraband_<Tag>::ptr;

template<typename Tag, typename Tag::type ptr_>
class steal : contraband_<Tag> {
    static inline const char filler = [] {
        steal::contraband_::ptr = ptr_;
        return '\0';
    }();
};
Run Code Online (Sandbox Code Playgroud)

...您可以通过指向它的指针间接访问任何私有成员...

class foo {
    int x = 3;
};

struct x_tag { using type = int foo::*; };

template class steal<x_tag, &foo::x>;

int main()
{
    foo f;
    // return f.x; ill-formed! Private!
    return f.*contraband<x_tag>; // Okay!
}
Run Code Online (Sandbox Code Playgroud)

现场观看

一个有趣的练习,但是您确实应该与同事一起解决问题,而不要诉诸于此。使用后果自负。