2012-01-25 5 views
4

Мне нужно получить доступ к объекту из DLL, выполнить некоторые манипуляции с объектом и передать объект другой функции. Проблема в том, что поля, которые мне нужно изменить, являются частными.Доступ к закрытым членам класса

Я не хочу изменять частный модификатор для полей в исходном классе, потому что класс был написан давно и используется во многих местах. Тем не менее, в том месте, где я манипулирую классом, мне нужна большая часть полей без защиты (это взлом). Каков наилучший способ сделать это?

Примечание: Я не разрешается изменять исходный класс

+0

Просто используйте указатели. –

+0

Что вы подразумеваете под словом «это взлом?» То, как вы описываете это, похоже на то, что вы приближаетесь к этому полностью неправильно, если хотите изменить частные поля извне. – templatetypedef

+0

Процитировать [Burt Bacharach и Carole Bayer Sager] (http://en.wikipedia.org/wiki/That's_What_Friends_Are_For): [Это то, для чего «друг») (http://www.parashift.com/ C++ - чаво-облегченный/friends.html). –

ответ

1

Если вы можете увидеть оригинальный класс, который вы можете сделать макет класса с той же битовой комбинацией и бросьте исходный объект в макете объект класса

Примера ниже

Оригинального класса

class ClassWithHiddenVariables 
{ 
private: 
    int a; 
    double m; 

}; 

Mock class

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

Если вы хотите увидеть участника s объекта 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; 
+0

- бит, гарантированный одинаковый для обоих классов –

+1

при условии, что вы используете один и тот же компилятор и настройки, которые, я думаю, да. Вы можете сделать некоторые проверки, если у вас есть какие-либо общедоступные переменные в классе. Просто проверьте, что публичные члены исходного объекта равны соответствующим членам макета. – Jimmy

1

Один из способов сделать это: Написать Getter/сеттер функции

+2

Это ничего не скрывает. Это просто разоблачает их другими способами. –

+1

ОП сказал, что хочет манипулировать полями. –

+0

@ jisaak-но мне не разрешено менять исходный класс. –

3

Что компилируется в DLL не очень важно в данном случае, имеет значение это заголовочный файл . Я предлагаю вам изменить заголовочный файл интересующего вас класса, чтобы необходимые вам переменные были public.

Доступ к члену проверяется компилятором, а не компоновщиком, поэтому все, что имеет значение, это то, как объявлен класс. Это не требует перекомпилировать DLL или изменить реализацию класса, но просто изменить файл заголовка (или копию файла заголовка).

+0

Учитывая, что OP хочет взломать и готов разбираться со днями или неделями отладки, это неизбежно вызовет, это похоже на лучший взлом. –

+0

Tha best hack evar! –

+1

+1, мне это нравится, но одна проблема - это путаница, которая вызовет любого, кто задумает код в будущем. –

0

«Forger» взломать от Исключительный стиль C++, пункт 15 будет работать. Хотя, это незаконно, поскольку оно нарушает правило одного определения, поэтому я бы посоветовал не делать этого в производственном коде.

От страницы 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; 
} 

Обратите внимание, как частный член "private_" класс X является доступным в Hijack.