强制访问私人成员[重复]

Posted

技术标签:

【中文标题】强制访问私人成员[重复]【英文标题】:Forcefully access private member [duplicate] 【发布时间】:2019-05-21 07:11:38 【问题描述】:

假设我正在使用一个不知道自己做得很好的人的开源库。 (重要成员不封装)真的是同事的代码我不可以修改,也不愿意帮我修改。

如何在不执行诸如重写假类或修改原始类之类的操作的情况下强制访问私有成员?

我尝试过#define private public 之类的方法,但类文件包含一些标准命名空间文件,这会导致编译错误。

我已经尝试过内存操作,但这需要成员身份验证,但这是行不通的。 (见下文)

#define PX_ACCESS_PRIVATE( pObject, _Member ) ( static_cast< std::size_t >( pObject ) + static_cast< std::size_t >( &( ( decltype( pObject )( nullptr ) )->_Member ) ) )

有什么想法吗?

【问题讨论】:

对你的经理大喊血腥谋杀,因为这不会找到可持续的解决方案。 @TarickWelling 哈哈,这是个好计划。 想必成员是私有的,因为封装,而不是缺少它。与您的同事讨论您为什么不能访问它,以及为什么您觉得有必要访问它,而不是要求他们按照您的意愿修改代码。这样你更有可能找到合适的解决方案。 任何使用非公共成员地址的内存操作都可能导致 UB,因为类不再具有标准的内存布局。这样做的方法是为您的任务请求适当的界面,向经理提供用户\开发者故事。或者创建自己的模拟,声称“这个模块不提供所需的功能”。这是最后的努力,就在用其他开发人员的头撞墙之前:P @manofasdf:是的,如果你的班级已经有了帮助模板,那么给出的答案就不需要帮助模板。这就是为什么我首先想知道你的班级是否已经有了模板。 【参考方案1】:

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

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';
    ();
;

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

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!

See it live.

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

【讨论】:

现在这是我在浏览 SO 时要寻找的东西。这太棒了。

以上是关于强制访问私人成员[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有“朋友”的情况下访问课外的私人数据成员? [重复]

私人访问控制 [重复]

C ++ - 结构与类[重复]

无法访问受保护的成员[重复]

访问受保护成员时出错[重复]

无法访问基类中的受保护成员 [重复]