Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции по имени 
:(
    Опции темы
knut
Дата 18.4.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Добрый день всем.
Че та не как не могу себя поймат на ошибке.
А вопрос вот сообственно в следуюшем. Надо вызвать функцию по имени.
Код

class cCaller
{
public:
    cCaller(){};
    ~cCaller(){};
public:
                typedef void (*mem_ptr)();
    std::map< std::string,mem_ptr > m_map;

public:
    void func1(){std::cout<<"1";}
    void func2(){std::cout<<"2";}
    void func3(){std::cout<<"3";}

    void Call_Function(std::string const &name)
    {
    if(m_map.empty())
        {

            m_map["func1"] = &func1;// вот здесь собственно и лажа.
            m_map["func2"] = &func2;
            m_map["func3"] = &func3;
        }
        m_map[name]();   
    }
};

добавляем в мап элемент лючь каторога "func1" a значение адрес функции func1 что не так?
Цитата



 


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Sartorius
Дата 18.4.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

вот здесь собственно и лажа


 чего пишет то компилятер? 
PM MAIL ICQ   Вверх
knut
Дата 18.4.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Цитата

'&' : illegal operation on bound member function expression



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Xenon
Дата 18.4.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



knut, название функции и является ее адресом


--------------------
user posted image  
PM MAIL   Вверх
JackYF
Дата 18.4.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



У тебя не получится просто так передать указатель на функцию, ведь это не обычная функция, а функция класса. Ей следует неявно передать и *this, как минимум. Так что в этом случае

Код

 typedef void (cCaller::* mem_ptr)();


и 

Код

boost::bind( m_map[name], *this)();


Если не ошибаюсь.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 18.4.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



А в данном случае фунции являются членами класса, поэтому не работает


--------------------
user posted image  
PM MAIL   Вверх
knut
Дата 18.4.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



поправил на 
Код

m_map["func1"] = &cCaller::func1;
m_map["func2"] = &cCaller::func2;
m_map["func3"] = &cCaller::func3;
и 
typedef void (cCaller::*mem_ptr)();

а как на по вызову  m_map[name]();   здесь что не так?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
MAKCim
Дата 18.4.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(knut @  18.4.2007,  19:00 Найти цитируемый пост)
а как на по вызову  m_map[name]();   здесь что не так? 

Код

(this -> *(m_map[name]))();



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
knut
Дата 18.4.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



MAKCim, в данном примере this не обезательно писать оно работать и без this a


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
MAKCim
Дата 18.4.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(knut @  18.4.2007,  19:19 Найти цитируемый пост)
MAKCim, в данном примере this не обезательно писать оно работать и без this a 

this (или другой указатель/ссылка на объект) обязателен
попробуй вместо 
Код

void func1(){std::cout<<"1";}

написать (без this)
Код

void func1() { std :: cout << a; }

где a - поле любого типа в классе


Это сообщение отредактировал(а) MAKCim - 18.4.2007, 19:29


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
knut
Дата 18.4.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



не ну я имел виду ошибка небыла связанна  с этим
Цитата

error:term does not evaluate to a function taking 0 arguments



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
dizzy1984
Дата 19.4.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Кстати чтобы быть более информативным можно заменить строку
Код

void func1(){std::cout<<"1";}

на
Код

void func1(){std::cout<<__FUNCTION__;}

и все аналогичные

Но это не будет работать на vc++6.0 и ниже.


Это сообщение отредактировал(а) dizzy1984 - 19.4.2007, 07:29
PM MAIL   Вверх
Earnest
Дата 20.4.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(knut @  18.4.2007,  20:32 Найти цитируемый пост)
не ну я имел виду ошибка небыла связанна  с этим

Конечно, потому что функция-член, которую ты пробовал так вызвать получает как минимум один аргумент.


--------------------
...
PM   Вверх
knut
Дата 21.4.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Earnest,  
точно Вы все правельно поняли smile 


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0843 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.