我需要从DLL访问一个对象,对该对象进行一些操作并将该对象提供给另一个函数。麻烦的是我需要更改的字段是私有的。
我不想更改原始类中字段的private修饰符,因为该类是很久以前编写的并且在很多地方使用过。但是,我操作类的地方我需要大部分没有保护的字段(这是一个黑客)。最好的方法是什么?
注意:我不允许更改原始课程
答案 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_”。