Форум программистов, компьютерный форум CyberForum.ru

Вызов функции не используя ее имя - C++

Восстановить пароль Регистрация
 
ValentinPirgach
Сообщений: n/a
15.06.2013, 00:30     Вызов функции не используя ее имя #1
Собственно, сабж. Задачку вот подкинули: нужно вызвать функцию так, что-бы ее имя нигде не упоминалось.
То есть, пишем класс, там нашу функу объявляем, делаем ее реализацию и... все. Только в этих двух местах будет фигурировать имя функции, в main ее нужно вызвать не упоминая ее имя, вообще. Как это можно сделать?
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2013, 00:30     Вызов функции не используя ее имя
Посмотрите здесь:

C++ Вызов функции
C++ Вызов функции.
C++ Вызов функции
Вызов функции C++
Вызов функции в возврате значения функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
2e1773ce
6 / 6 / 0
Регистрация: 10.03.2013
Сообщений: 96
15.06.2013, 00:49     Вызов функции не используя ее имя #2
забить ее реализацию в конструктор : P
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
15.06.2013, 00:49     Вызов функции не используя ее имя #3
Сделать её конструктором / деструктором класса.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
15.06.2013, 01:08     Вызов функции не используя ее имя #4
Задача не ясна полностью что вы имеете введу но вот импровизация моего восприятия или одного из многих вариантов решения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
 
 class my
 {
  private:
   const char* line;
  public:
    my(void);
    const char* getline(void);    
 }*p = new my;
 
 my::my(void):line("Hello World!")
 {}
 
 const char* my::getline(void)
 {
   return(line);
 }
const char* (my::*pmf)(void) = &my::getline;
 
int main(void)
{
 
  std::cout << (p->*pmf)() << std::endl;
  system("pause");
  return 0;
}
Это пример учебный использовать в лоб нельзя т.к. я не освобождаю память, она освободиться сама после завершения программы. Можно изменить строчку
C++
1
}*p = new my;
на
C++
1
}d,*p = &d;
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.06.2013, 01:29     Вызов функции не используя ее имя #5
в предложенном выше варианте имя все-таки используется в коде.
еще один вариант можно попробовать. хоть он и будет зависить от компилятора, но попробовать можно.
значит делаем функцию, которую нужно вызвать виртуальной. на это компилятор в каждом объекте класса будет размещать указатель на таблицу виртуальных функций. вот можно попробовать по адресу объекта выцепить указатель на таблицу виртуальных функций и в ней по определенному смещению будет указатель на нужную функцию. вот ее и вызвать. как я уже сказал, явно средствами с++ это сделать не получится, нужно будет
закладываться на то, как относительно начала объекта этот указатель смещен и как в этой таблице размещены указатели.
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
15.06.2013, 01:35     Вызов функции не используя ее имя #6
@DU, как раз написал такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*************************************************************************************/
#include    <tchar.h>
#include    <iostream>
#include    <functional>
 
#include    <cstdint>
/*************************************************************************************/
 
class CTest
{
    virtual void CallOnMe() {std::cout << "Call on me, call on me...\n";}
};
 
int _tmain(int argc, _TCHAR* argv[])
{  
    CTest   cTest;
    
    // Вариант 1
    std::function<void()>   fTest   = reinterpret_cast<void (*)()>(**reinterpret_cast<size_t***>(&cTest));
    fTest();
 
    
    // Вариант 2
    #if SIZE_MAX == UINT32_MAX
        #define XAX EAX
    #else
        #define XAX RAX
    #endif
    
    void (*pfTest)()                = 0;
    __asm
    {
        LEA     XAX, cTest
        MOV     XAX, [XAX]
        MOV     XAX, [XAX]
        MOV     pfTest, XAX
    }
    pfTest();
 
    std::system("pause");
    return      0;
}
/*************************************************************************************/
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
15.06.2013, 01:47     Вызов функции не используя ее имя #7
Цитата Сообщение от DU Посмотреть сообщение
в предложенном выше варианте имя все-таки используется в коде
Изначально задание в таком виде как оно сформировано невыполнимо - по одной простой причине. Если мы просто напишем объявление и определение класса то нам не будет не выделено не байта памяти под класс. Следовательно ни о каких вызовах быть речи не может. А если мы объявим эту функцию как статическую или все таки создадим объект то не обращаясь к заданному имени метода(что является указателем на определенную область памяти) мы сможем вызвать метод класса оперируя с памятью. Следовательно один фиг мы будем вынуждены использовать псевдо имена или имена регистров. По этому повторюсь что задание не однозначно и скорее всего автор сам не имеет четкого представления о том что спрашивает.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
15.06.2013, 02:44     Вызов функции не используя ее имя #8
ValentinPirgach, вызывайте в открытом методе имя которого можно упомянуть. Хотя бы шёпотом.
BAADF00D
Заблокирован
15.06.2013, 02:58     Вызов функции не используя ее имя #9
ну в Си это делается совсем просто
C
1
2
3
 int (*foo)(FILE*, const char, ...);
foo = fprintf;
foo(stdout, "%s\n", "Hi, my friend");
Но вот в плюсах сделать что-то подобное внутрях класса. Не получается пока.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
вызывайте в открытом методе имя которого можно упомянуть. Хотя бы шёпотом
кстати, Просто и оригинально.
Dr_Ace
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 6
31.07.2015, 12:40     Вызов функции не используя ее имя #10
Desu_Is_A_Lie, Большое спасибо нашёл для себя интересным ваш подход, не подскажите ли следующее, например:
C++
1
2
3
4
5
6
7
class CTest
{
    virtual void CallOnMe1() {std::cout << "Call on me 1, call on me...\n";}
    virtual void CallOnMe2() {std::cout << "Call on me 2, call on me...\n";}
    virtual void CallOnMe3() {std::cout << "Call on me 3, call on me...\n";}
    ***
};
вопрос 1:
на вышеуказанном примере 1 и 2 можно ли вызвать функции, например по порядку через один "указатель/строчку кода" или выборочно по некоторому закону (рандомно), то есть перемещать указатель для вызова той или иной функции ?

вопрос 2:
как узнать размер в байтах функции CTest::CallOnMe() и сколько есть функций в CTest (1,2,3 ... ) ?

Буду благодарен за ответ.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 02:22     Вызов функции не используя ее имя
Еще ссылки по теме:

Вызов функции C++
C++ Используя рекурсивный вызов функции вычислить сумму заданного числа элементов ряда
Вызов функции в параметре другой функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kuza84
-4 / 23 / 4
Регистрация: 25.04.2013
Сообщений: 195
01.08.2015, 02:22     Вызов функции не используя ее имя #11
Была идея в функции разместить"секретную" функцию, но её уже озвучили.
Yandex
Объявления
01.08.2015, 02:22     Вызов функции не используя ее имя
Ответ Создать тему
Опции темы

Текущее время: 02:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru