EL[michlen] Опубликовано 9 июня, 2006 Жалоба Поделиться Опубликовано 9 июня, 2006 Вот такую интересную вещь встретил: #include <iostream> class A { private: void pf(void) { std::cout << "Wabadam!!"; } public: typedef void (A::*ptrf)(void); ptrf gimmi() { return &A::pf; } }; int main(int, char**) { A a; A::ptrf f = a.gimmi(); (a.*f)(); } Как считаете, скомпилируется ли? Если да, то будет ли работать? Не будет ли ошибки доступа к private-функции класса? Просьба отвечать без компилятора, это всего лишь задачка. © LuckLess Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
etybaxe Опубликовано 9 июня, 2006 Жалоба Поделиться Опубликовано 9 июня, 2006 в принципе смысл разрешить такой доступ есть, в редких случаях его можно эффективно использовать - должно скомпилироваться, к тому же метод класса это не код, а всего лишь его адресс, так что если ошибка и произойдет то на этапе компиляции ptrf gimmi() возвращающей поинтер на приватный метод класса. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Byte Опубликовано 9 июня, 2006 Жалоба Поделиться Опубликовано 9 июня, 2006 а где здесь непосредственный доступ к private-функции класса? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 9 июня, 2006 Жалоба Поделиться Опубликовано 9 июня, 2006 Имхо, должно собраться. Приватный он в случае, если производится попытка вызова его напрямую, а что касается адресов - то подобные проверки вряд ли компиляторами производятся, поскольку должны приводить к усложнению алгоритма компиляции и соответственно к увеличению времени компиляции. А зачем это делать? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
etybaxe Опубликовано 9 июня, 2006 Жалоба Поделиться Опубликовано 9 июня, 2006 Byte писал(а) Сбт, 10 Июня 2006 01:13 а где здесь непосредственный доступ к private-функции класса? именно что нигде, а зная оффсет и объект, функцию может вызвать любой, и зависнуть ничего не может. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.