Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 2
Регистрация: 21.12.2011
Сообщений: 60
1

Вызвать метод через указатель на метод

18.11.2016, 15:13. Просмотров 465. Ответов 1
Метки нет (Все метки)


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
class MenuItem
{
public:
    MenuItem(string name, MenuItem *parent = nullptr, void(MenuItem::*EventHadler)() = nullptr, bool isSelected = false)
    {
        this->name = name;
        this->parent = parent;
        this->EventHadler = EventHadler;
        this->isSelected = isSelected;
        this->items = new vector<MenuItem*>();
    }
    ~MenuItem();
 
    friend ostream& operator<<(ostream& output, const MenuItem &right);
    void PrintSubItems();
    void Open();
    void AddItem(MenuItem *item) { items->push_back(item); }
    static MenuItem* CreateMenu();
 
    void(MenuItem::*EventHadler)();
private:
    string name;
    MenuItem *parent;
    bool isSelected;
    vector<MenuItem*> *items;
};
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
44
45
46
47
48
49
50
51
52
53
#include "MenuItem.h"
 
MenuItem::~MenuItem()
{
    for(int i = 0; i < items->size(); i++)
    {
        delete (*items)[i];
    }
 
    delete items;
}
 
MenuItem* MenuItem::CreateMenu()
{
    MenuItem *root = new MenuItem("root", nullptr, &MenuItem::PrintSubItems);
    ////////////////////////////////////
    MenuItem *file = new MenuItem("File", nullptr, &MenuItem::PrintSubItems, true);
    file->AddItem(new MenuItem("Open", file, &MenuItem::Open, true));
    file->AddItem(new MenuItem("Save", file, &MenuItem::Open));
 
    MenuItem *saveAs = new MenuItem("Save as...", file, &MenuItem::PrintSubItems);
    saveAs->AddItem(new MenuItem("Save as text file", saveAs, &MenuItem::Open, true));
    saveAs->AddItem(new MenuItem("Save as binary file", saveAs, &MenuItem::Open));
 
    file->AddItem(saveAs);
    file->AddItem(new MenuItem("Exit"));
    ////////////////////////////////////
    MenuItem *edit = new MenuItem("Edit", nullptr, &MenuItem::PrintSubItems);
    edit->AddItem(new MenuItem("Add entry", edit, &MenuItem::Open, true));
    edit->AddItem(new MenuItem("Change entry", edit, &MenuItem::Open));
    edit->AddItem(new MenuItem("Remove entry", edit, &MenuItem::Open));
    ////////////////////////////////////
    MenuItem *print = new MenuItem("Print", nullptr, &MenuItem::PrintSubItems);
    print->AddItem(new MenuItem("More than 100000 km", print, &MenuItem::Open, true));
    print->AddItem(new MenuItem("5 most new cars", print, &MenuItem::Open));
    ////////////////////////////////////
    root->AddItem(file);
    root->AddItem(edit);
    root->AddItem(print);
 
    return root;
}
 
void MenuItem::PrintSubItems()
{
    cout << this;
}
 
void MenuItem::Open()
{
    cout << "Opened" << endl;
    cin.get();
}
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    setlocale(LC_ALL, "RUS");
 
    MenuItem *root = MenuItem::CreateMenu();
    (root->EventHadler)(); //Не работает
 
    cin.get();
    return 0;
}
В функции main вызов метода через указатель не работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2016, 15:13
Ответы с готовыми решениями:

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); ...

Возможно ли вызвать метод наследника через указатель на базовый класс
Возможно ли вызвать метод наследника,через указатель на базовый класс, если он не определён как...

Не получается вызвать метод класса потомка через ссылку
class Book { protected: char type; char title; char ISBN; char edition;...

Как передать указатель на функцию через метод класса ?
typedef void (*FuncCallback)(float* flValue); Пробовал по всякому и ни как: Class.CallFunc...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
1
Эксперт С++
8411 / 3946 / 864
Регистрация: 15.11.2014
Сообщений: 8,894
18.11.2016, 15:48 2
vars-cat,

http://rextester.com/VKVV69969


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//g++  4.9.3
 
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
class MenuItem
{
public:
    MenuItem(string name, MenuItem *parent = nullptr, void(MenuItem::*EventHadler)() = nullptr, bool isSelected = false)
    {
        this->name = name;
        this->parent = parent;
        this->EventHadler = EventHadler;
        this->isSelected = isSelected;
        this->items = new vector<MenuItem*>();
    }
    ~MenuItem();
 
    friend ostream& operator<<(ostream& output, const MenuItem &right);
    void PrintSubItems();
    void Open();
    void AddItem(MenuItem *item) { items->push_back(item); }
    static MenuItem* CreateMenu();
 
    void(MenuItem::*EventHadler)();
private:
    string name;
    MenuItem *parent;
    bool isSelected;
    vector<MenuItem*> *items;
};
 
MenuItem::~MenuItem()
{
    for(int i = 0; i < items->size(); i++)
    {
        delete (*items)[i];
    }
 
    delete items;
}
 
MenuItem* MenuItem::CreateMenu()
{
    MenuItem *root = new MenuItem("root", nullptr, &MenuItem::PrintSubItems);
    ////////////////////////////////////
    MenuItem *file = new MenuItem("File", nullptr, &MenuItem::PrintSubItems, true);
    file->AddItem(new MenuItem("Open", file, &MenuItem::Open, true));
    file->AddItem(new MenuItem("Save", file, &MenuItem::Open));
 
    MenuItem *saveAs = new MenuItem("Save as...", file, &MenuItem::PrintSubItems);
    saveAs->AddItem(new MenuItem("Save as text file", saveAs, &MenuItem::Open, true));
    saveAs->AddItem(new MenuItem("Save as binary file", saveAs, &MenuItem::Open));
 
    file->AddItem(saveAs);
    file->AddItem(new MenuItem("Exit"));
    ////////////////////////////////////
    MenuItem *edit = new MenuItem("Edit", nullptr, &MenuItem::PrintSubItems);
    edit->AddItem(new MenuItem("Add entry", edit, &MenuItem::Open, true));
    edit->AddItem(new MenuItem("Change entry", edit, &MenuItem::Open));
    edit->AddItem(new MenuItem("Remove entry", edit, &MenuItem::Open));
    ////////////////////////////////////
    MenuItem *print = new MenuItem("Print", nullptr, &MenuItem::PrintSubItems);
    print->AddItem(new MenuItem("More than 100000 km", print, &MenuItem::Open, true));
    print->AddItem(new MenuItem("5 most new cars", print, &MenuItem::Open));
    ////////////////////////////////////
    root->AddItem(file);
    root->AddItem(edit);
    root->AddItem(print);
 
    return root;
}
 
void MenuItem::PrintSubItems()
{
    cout << this;
}
 
void MenuItem::Open()
{
    cout << "Opened" << endl;
    cin.get();
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    setlocale(LC_ALL, "RUS");
 
    MenuItem *root = MenuItem::CreateMenu();
    
    root->EventHadler = &MenuItem::PrintSubItems;
    
    (root->*root->EventHadler)();
    
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2016, 15:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Есть метод класса внутри , есть проверка. Если условие сходится то метод должен выдать указатель, иначе булевую переменную
Есть метод класса внутри которого, посередине, есть проверка. Если условие сходится то метод должен...

Вычислить и распечатать сумму элементов массива, используя указатель и метод доступа через разименование
В программе создайте массив из 10 элемента типа float с произвольными числовыми значениями,...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Как передать в метод класса Menu указатель на метод дочернего класса?
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: ...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая...

Указатель на объект или указатель на метод объекта
Здравствуйте! У меня много где случается, что надо классу заводить в заголовке указатель на объект...


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

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

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