Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вызов функции по имени


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

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 что не так?
Цитата



 

Автор: Sartorius 18.4.2007, 18:42
Цитата

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


 чего пишет то компилятер? 

Автор: knut 18.4.2007, 18:45
Цитата

'&' : illegal operation on bound member function expression

Автор: Xenon 18.4.2007, 18:46
knut, название функции и является ее адресом

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

Код

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


и 

Код

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


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

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

Автор: knut 18.4.2007, 19:00
поправил на 
Код

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

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

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

Код

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

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

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

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

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

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

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

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

Автор: knut 18.4.2007, 19:32
не ну я имел виду ошибка небыла связанна  с этим
Цитата

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

Автор: dizzy1984 19.4.2007, 07:28
Кстати чтобы быть более информативным можно заменить строку
Код

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

на
Код

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

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

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

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

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

Автор: knut 21.4.2007, 14:21
Earnest,  
точно Вы все правельно поняли smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)