访问班级中的私人成员

时间:2012-01-25 18:13:07

标签: c++ class private-members

我需要从DLL访问一个对象,对该对象进行一些操作并将该对象提供给另一个函数。麻烦的是我需要更改的字段是私有的。

我不想更改原始类中字段的private修饰符,因为该类是很久以前编写的并且在很多地方使用过。但是,我操作类的地方我需要大部分没有保护的字段(这是一个黑客)。最好的方法是什么?

注意:我不允许更改原始课程

4 个答案:

答案 0 :(得分:3)

在这种情况下,DLL中编译的内容并不重要,重要的是您包含的头文件。我建议你更改你感兴趣的类的头文件,这样你需要的变量是public

成员访问由编译器检查,而不是由链接器检查,因此重要的是如何声明类。这 not 要求您重新编译DLL或更改类的实现,而只是修改头文件(或头文件的副本)。

答案 1 :(得分:1)

一种方法:编写Getter / Setter函数

答案 2 :(得分:1)

如果你能看到原始类,你可以创建一个具有相同位模式的mock类,并将原始对象强制转换为mock类对象

以下示例

原创课程

class ClassWithHiddenVariables
{
private:
    int a;
    double m;

}; 

模拟课程

 class ExposeAnotherClass
    {
    public:
        int a_exposed;
        double m_exposed;
    };

如果要查看ClassWithHiddenVariables对象的成员,请使用reinterpret_cast转换为ExposeAnotherClass

 ClassWithHiddenVariables obj;
    obj.SetVariables(10, 20.02);    
    ExposeAnotherClass *ptrExposedClass;
    ptrExposedClass = reinterpret_cast<ExposeAnotherClass*>(&obj);  
    cout<<ptrExposedClass->a_exposed<<"\n"<<ptrExposedClass->m_exposed;

答案 3 :(得分:0)

来自特殊C ++样式的“Forger”攻击,第15项将起作用。虽然它违反了One Definition Rule是违法的,所以我建议不要在生产代码中这样做。

来自第106页

// Example 15-1: Lies and Forgery
//
class X {
    // instead of including x.h, manually (and illegally) duplicates X's
    // definition, and adds a line such as:
    friend ::Hijack( X& );
};

void Hijack( X& x ) {
    x.private_ = 2;
}

注意如何在Hijack中访问X类的私有成员“private_”。