Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ValentinPirgach
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 1
#1

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

15.06.2013, 00:30. Просмотров 619. Ответов 10
Метки нет (Все метки)

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

Используя рекурсивный вызов функции вычислить сумму заданного числа элементов ряда - C++
В программировании я просто дуб дубом, но нужно срочно сделать одну задачу в Qt. Сама задача: Используя рекурсивный вызов функции...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include <iostream> using std::cout; void f(const int &ref){...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель) - C++
#include <iostream> using namespace std; template <class T1> class mas { public: T1 n; T1 a; void input() ...

Вытащить имя файла и расширение используя regex - C++
В общем стоит задача проверить относительную часть ссылки на валидность и при этом вытащить нужные части из нее, такие как, уровни...

Вызов функции в параметре другой функции - C++
программа: #include <iostream> using namespace std; struct E { E() {} }; void f(const E& e)

Вызов функции в возврате значения функции - C++
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

10
2e1773ce
6 / 6 / 0
Регистрация: 10.03.2013
Сообщений: 96
15.06.2013, 00:49 #2
забить ее реализацию в конструктор : P
0
Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
15.06.2013, 00:49 #3
Сделать её конструктором / деструктором класса.
0
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;
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.06.2013, 01:29 #5
в предложенном выше варианте имя все-таки используется в коде.
еще один вариант можно попробовать. хоть он и будет зависить от компилятора, но попробовать можно.
значит делаем функцию, которую нужно вызвать виртуальной. на это компилятор в каждом объекте класса будет размещать указатель на таблицу виртуальных функций. вот можно попробовать по адресу объекта выцепить указатель на таблицу виртуальных функций и в ней по определенному смещению будет указатель на нужную функцию. вот ее и вызвать. как я уже сказал, явно средствами с++ это сделать не получится, нужно будет
закладываться на то, как относительно начала объекта этот указатель смещен и как в этой таблице размещены указатели.
0
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;
}
/*************************************************************************************/
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
15.06.2013, 01:47 #7
Цитата Сообщение от DU Посмотреть сообщение
в предложенном выше варианте имя все-таки используется в коде
Изначально задание в таком виде как оно сформировано невыполнимо - по одной простой причине. Если мы просто напишем объявление и определение класса то нам не будет не выделено не байта памяти под класс. Следовательно ни о каких вызовах быть речи не может. А если мы объявим эту функцию как статическую или все таки создадим объект то не обращаясь к заданному имени метода(что является указателем на определенную область памяти) мы сможем вызвать метод класса оперируя с памятью. Следовательно один фиг мы будем вынуждены использовать псевдо имена или имена регистров. По этому повторюсь что задание не однозначно и скорее всего автор сам не имеет четкого представления о том что спрашивает.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6511 / 3148 / 308
Регистрация: 04.12.2011
Сообщений: 8,718
Записей в блоге: 5
15.06.2013, 02:44 #8
ValentinPirgach, вызывайте в открытом методе имя которого можно упомянуть. Хотя бы шёпотом.
0
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 Посмотреть сообщение
вызывайте в открытом методе имя которого можно упомянуть. Хотя бы шёпотом
кстати, Просто и оригинально.
0
Dr_Ace
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 10
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 ... ) ?

Буду благодарен за ответ.
0
kuza84
-4 / 23 / 4
Регистрация: 25.04.2013
Сообщений: 195
01.08.2015, 02:22 #11
Была идея в функции разместить"секретную" функцию, но её уже озвучили.
0
01.08.2015, 02:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 02:22
Привет! Вот еще темы с ответами:

вызов функции из под функции - C++
Добрый вечер. Такая ситуация: есть функция, назовем ее MainThreadFunc. Как можно сделать так, чтобы любая другая функция, которую я напишу,...

Найти среднее арифметическое значений функции f(x) в точках a, b, (a+b)/2 используя обращение к функции - C++
А этой нету: 3.Найти среднее арифметическое значений функции f(x) в точках a, b, (a+b)/2 используя обращение к функции f=(x*sin⁡ π/4) /...

Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу - C++
Стоит следующая задача: Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу. Функцию написал, но я...

Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции - C++
Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции. f=arctgx+ln^2 x^2 Нужно...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.