| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Хитрый доступ к private полям/методам класса |
| Автор: Aqs 12.5.2010, 19:09 | ||
| Здравствуйте! Вопрос таков - как получить из внешней функции доступ к private полям и методам класса, при этом ничего в самом классе не изменяя ? (вариант объявить методы и поля как public тоже не подходит) Например, из main, модифицировать и вывести на экран поле a, и вызвать метод c, определенные в следующем тривиальном классе:
Подозреваю, что нужно как-то добираться до них через адреса, но сколько не пробовал - никак не выходит. Прошу совета. |
| Автор: azesmcar 12.5.2010, 20:28 | ||||
через грязные хаки
но это непереносимо, стандарт не позволяет определять макросы с ключевыми словами.
Добавлено через 1 минуту и 9 секунд еще для доступа к переменным можно подменить класс идентичным через reinterpret_cast.. но зачем это надо? |
| Автор: toxx 12.5.2010, 20:38 | ||
| azesmcar сорри за оффтоп , но напоминает идусский код...
|
| Автор: azesmcar 12.5.2010, 20:39 | ||
так и есть вот это кстати получше
|
| Автор: Aqs 12.5.2010, 20:45 | ||
Задание такое получил, в университете... |
| Автор: kemiisto 12.5.2010, 20:49 |
Да, всё правильно написали. |
| Автор: azesmcar 12.5.2010, 20:49 |
Не устану повторять, такие вопросы лучше задавать в google-е...он все знает![]() |
| Автор: Aqs 12.5.2010, 20:57 |
| Если бы было так легко найти, я бы уже давно нашел Понадеялся что тут найдутся знающие люди, которые помогут. Кстати, вариант с грязными хаками неподходит - нужно что-то более "легальное" |
| Автор: Леопольд 12.5.2010, 22:00 |
| Препод, видимо, С++ по Подбельски учил... |
| Автор: Alek86 12.5.2010, 22:05 |
| есть только один нормальный способ это сделать, но только если у класса есть хоть одна неприватная шаблонная функция-член описан у Саттера, причем очень красиво но уверен, препод его в виду не имел |
| Автор: Леопольд 12.5.2010, 22:08 |
Добавлено через 3 минуты и 29 секунд А если с множественным наследованием или виртуальными функциями? Вроде бы, если это не POD, то behaviour is undefined. |
| Автор: azesmcar 12.5.2010, 22:21 | ||
Я уже написал что это грязный и непереносимый хак, который к тому же касался конкретно описанного класса. |
| Автор: Леопольд 12.5.2010, 22:31 |
| azesmcar, я понимаю что ты знал почему это хак. |
| Автор: Леопольд 12.5.2010, 22:48 | ||
| Вот мой вариант "бреда" http://codepad.org/uRXBy0SZ
Твоему чокнутому профессору должно понравиться, ведь ещё и на vtbl завязано. Разберись что такое "виртуальная таблица функций" и по ушам ему этим проедь. Глядишь, зачтёт. Ты главное напирай на то, что это зачётно! З.Ы. Это пример как нельзя кодить. |
| Автор: Alek86 12.5.2010, 22:57 | ||
ну и чего в классе в случае шаблона меняется? специализации могут быть хоть в другом cpp |
| Автор: Леопольд 12.5.2010, 23:01 |
| Ты меня, видимо, неправильно понял. Нет такой функции в исходном классе (см. первый пост). |
| Автор: Alek86 12.5.2010, 23:02 | ||
а зачем виртуальные функции? |
| Автор: Леопольд 12.5.2010, 23:08 |
| Обрати внимание на то, что функция b реализована только в A классе. ptr->b() вызывается через vtbl класса A. Я же говорю, зачётно. |
| Автор: Aqs 12.5.2010, 23:13 | ||
| Спасибо за идею, но... Исходный класс изменять нельзя вообще никак, в этом-то и вся соль - у меня тоже была мысль что-то замутить с виртуальными функциями, но без переобъявления метода b как виртуального и в классе А, ничего не выйдет. А делать этого нельзя, по условию. Да и с виртуальными функциями уже по курсу имели тесное общение - мозги ему запудрить неполучится С полями вроде разобрался... Идея похожа на Вашу (используется так же вспомогательный класс) :
А вот с методами по-прежнему непонятно что делать. |
| Автор: Леопольд 12.5.2010, 23:19 | ||
Aqs, я ему верю больше чем твоему преподу - маньяку. |
| Автор: Aqs 12.5.2010, 23:24 |
Да, я тоже с каждым часом начинаю всё больше сомневаться в реализуемости этого... Хотя конечно может решение и есть, но видимо только преподы-маньяки знают его |
| Автор: Леопольд 12.5.2010, 23:25 |
| http://codepad.org/6Ll4wy13 Нельзя взять адрес приватной функции. |
| Автор: mes 13.5.2010, 12:15 | ||||||||||
попробую развеять сомнения
надеюсь очепяток не допустил |
| Автор: Aqs 13.5.2010, 14:05 |
| mes, спасибо! Действительно, всё отлично работает Только вот осталось непонятным, почему обязательно нужно объявлять b() вне класса A ? Если b() будет объявлена внутри, то получается нужно в структуре продублировать код функции? |
| Автор: mes 13.5.2010, 15:03 | ||||||
ага
или можно поступить проще, воспользоваться дефайнами, как предлaгал azesmzar, но применить его только в a_hack.cpp файле, так сказать компромисс - весь хак будет собран в одном месте и никого другого не зацепит..
|
| Автор: Alek86 13.5.2010, 16:16 |
| mes, это нестандартно сильно подозреваю, что твое решение нестандартно тоже, хотя четких доказательств нету |
| Автор: mes 13.5.2010, 18:05 |
ну тут доказывать то сильно и не надо - достаточно того, что у нас получаются два разных описания класса насчет нестандартности метода, я думаю, также говорили префиксы имен функций hack_ но .. раз преподу хочется, сделаем ему приятное |
| Автор: Alek86 13.5.2010, 21:50 |
вот я и не знаю, запрещает ли это стандарт явно шаблонные методы тоже могут привести к разным описаниям... |
| Автор: mes 13.5.2010, 23:35 | ||
нда.. сформулировал я неправильно.. разные описания это не проблема, зависит от того что разное имелось ввиду то, что описание приводит к различным "представлениям". В стандарте (раздел ODR) накладывается ряд ограничений, после которых обе копии считаются идентичными, но рассматривается ли там наша ситуация, я так и не понял |