Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182

Вызов функции-члена элементов списка

11.08.2015, 20:20. Показов 1095. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот есть список, хранящий указатели (на экземпляры классов).
Можно ли в нем реализовать подобную функцию?, вызывая которую, мы будем заведомо знать, адреса экземпляров какого именно класса он содержит.
C++
1
2
3
4
5
6
7
void Execute( <?> function, ... ){
    ptr* srh = head;
    while( srh ){
        srh->function( ... );
        srh = srh->next;
    }
}
Или как-то иначе это реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2015, 20:20
Ответы с готовыми решениями:

рекурсивный вызов функции-члена
как осуществить рекурсивный вызов функции члена?

Вызов функции члена в заданом диапазоне
Нужно описать класс, в котором значение функции будет вычисляться в заданном диапазоне. Ну, допустим, есть функция: if (x &lt; 0)...

Вызов функции-члена класса по адресу в памяти
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

9
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
11.08.2015, 20:34
Eraston, в списке можно хранить указатели на объекты "родственных" классов (т.е. имеющих общего предка), создавая список как раз с элементами-указателями этого предка (надеюсь, я не ошибаюсь). Если это так, при пролистывании списка проверяйте тип элемента на равенство с типами, имеющих эту функцию, через операцию typeid, ну о ней в Интернете найде информацию
1
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
11.08.2015, 20:35
Распиши изначальную задачу, которую ты хочешь решить, подробнее. Можешь почитать про RTTI. Но, думаю, что тебе можно обойтись без этого.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
11.08.2015, 20:55  [ТС]
Цитата Сообщение от tnk500 Посмотреть сообщение
Eraston, в списке можно хранить указатели на объекты "родственных" классов (т.е. имеющих общего предка), создавая список как раз с элементами-указателями этого предка (надеюсь, я не ошибаюсь)
Цитата Сообщение от Velesthau Посмотреть сообщение
Распиши изначальную задачу, которую ты хочешь решить, подробнее.
Это всё хорошо, но суть: написать один класс List с одной функцией Execute, дающей возможность вызова любого метода экземпляра любого класса. Т.е. в List могут содержаться классы разных веток, разных уровней.
Цитата Сообщение от tnk500 Посмотреть сообщение
проверяйте тип элемента на равенство с типами, имеющих эту функцию, через операцию typeid
Перебор и сравнение всех возможных типов?
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
11.08.2015, 21:04
Eraston, именно. Впрочем, стоит посмотреть в сторону указателей на функции-члены объекта класса. Но это потребует одинакового имени функции в элементах списка (если нужно функцию вызвать непременно из всех), а также совпадение изначального типа указателя на функцию с типом функции, которую нужно вызвать.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.08.2015, 21:51
Цитата Сообщение от Eraston Посмотреть сообщение
реализовать?
вы хотите что то вроде такого?

http://rextester.com/JHSY73012

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
#include <iostream>
#include <list>
 
struct base
{
 
    virtual void foo() = 0;
 
};
 
 
struct der: base
{
    virtual void foo()  { std::cout<< "der::foo\n"; }
};
 
struct baz: base
{
    virtual void foo()  { std::cout<< "baz::foo\n"; }
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::list<base*> mylist;
    
    mylist.emplace_back( new der );
    mylist.emplace_back( new baz );
    
    auto&& method = &base::foo;
    
    for(auto&& p: mylist)
        (p->*method)();
    
}
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
11.08.2015, 22:30  [ТС]
Попользовался гуглом.
Думаю, это вполне корректно будет?:
Код
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
class A{
public:
    virtual int f1( int k ){printf("%d: aprint:%d\n",k,a);return a;}
    void f2( int k ){printf("%d: avoid:%d\n",k,a);}
    int a;
};
class B: public A{
public:
    B( int a, int b ):b(b){A::a=a;}
    virtual int f1( int k ){printf("%d: bprint:%d %d\n",k,a,b);return a;}
    void f2( int k ){printf("%d: bvoid:%d %d\n",k,a,b);}
    int b;
};
class L{
public:
    L(){
        for(int i = 0; i < s; i++ ){
            p[i] = new B( rand() % 10, rand() % 10 );
        }
    }
    ~L(){
        for(int i = 0; i < s; i++ ){
            if( p[i] ) delete p[i];
        }
    }
    template <typename T, typename F> void exe( F f ){
        for(int i = 0; i < s; i++ ){
            // + добавить проверку типа и наличия функции
            if( p[i] ) ( ( (T*)p[i] )->*f )( i );
        }
    }
private:
    enum{s=3};
    int n = 0;
    A *p[s];
};
int _tmain(int argc, _TCHAR* argv[])
{
    srand(134);
    L base;
    base.exe<A>( &A::f1 );
    base.exe<B>( &B::f1 );
    base.exe<A>( &A::f2 );
    base.exe<B>( &B::f2 );
    getchar();
    return 0;
}
Вывод
0: bprint:4 6
1: bprint:7 3
2: bprint:1 2
0: bprint:4 6
1: bprint:7 3
2: bprint:1 2
0: avoid:4
1: avoid:7
2: avoid:1
0: bvoid:4 6
1: bvoid:7 3
2: bvoid:1 2


Добавлено через 2 минуты
hoggy, может, конечно, std весь там такой функциональный, но мне необходим полный доступ к классам и возможности их модифицирования.

Добавлено через 17 минут
Цитата Сообщение от hoggy Посмотреть сообщение
for(auto&& p: mylist)
* * * * (p->*method)();
Не говоря уже о том, что здесь, походу, элементы списка выходят за его пределы, чего категорически нельзя допускать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.08.2015, 22:52
Цитата Сообщение от Eraston Посмотреть сообщение
может, конечно, std весь там такой функциональный, но мне необходим полный доступ к классам и возможности их модифицирования.
не понял, при чем тут std, и как это мешает получать нолный доступ к объектам классов.

Цитата Сообщение от Eraston Посмотреть сообщение
Не говоря уже о том, что здесь, походу, элементы списка выходят за его пределы, чего категорически нельзя допускать.
цикл вида:
C++
1
2
for(auto&& p: mylist)
    (p->*method)();
в принципе не допускает выход за пределы диапазона.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
11.08.2015, 22:57  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
в принципе не допускает выход за пределы диапазона.
Допускает доступ к *p.
Цитата Сообщение от hoggy Посмотреть сообщение
не понял, при чем тут std, и как это мешает получать нолный доступ к объектам классов.
Полный доступ к классу list
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 02:51
Цитата Сообщение от Eraston Посмотреть сообщение
Допускает доступ к *p.
ну и?

Цитата Сообщение от Eraston Посмотреть сообщение
Полный доступ к классу list
лист полностью под вашем контролем

вы сказать то что хотели?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2015, 02:51
Помогаю со студенческими работами здесь

Вызов функции-члена через std::function
Суть в следующем Задача сделать обертку вызывающую функцию член класса с параметрами. Для этого используется класс: ...

Объявление класса, создание объекта и вызов функции-члена
Всем добрый день! Вот так я объявляю класс. typedef map&lt;string, double&gt; datablock; typedef map&lt;string, string&gt; groupvars;...

Как такое может быть? (вызов функции-члена без объекта)
собственно вопрос озвучен. #include &lt;iostream&gt; using namespace std; class Test { public: void print() {

Простое Наследование и ошибка "Недопустимый вызов нестатической функции-члена"
У меня есть два класса M и К (наследуется от М). В классе М есть три переменные a,b,c. В классе К есть два a1,b1. В классе К есть метод k1,...

Недопустимый вызов нестатической функции-члена в программе "Калькулятор"
Здравствуйте, я буквально вчера начал изучать Qt. Ну и столкнулся с проблемой &quot;Недопустимый вызов нестатической функции-члена&quot; -...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru