none
Как перегрузить указатель на метод класса? RRS feed

  • Вопрос

  • Язык программирования: C++

    Здравствуйте, можно ли перегрузить указатель на метод класса?

    В классе Test есть перегруженный метод f(void) и f(int num). В main() я создаю указатель на метод f класса Test, но этот указатель работает только при пустом списке передаваемых аргументов. Это правило язык или я что-то неправильно делаю? Пример ниже

    #include <iostream>
    
    using namespace std;
    
    class Test {
    public:
    	Test(void) : num(0) {}
    	void f(void);
    	void f(int num);
    private:
    	int num;
    };
    
    void Test::f(void)
    {
    	cout << "void" << endl;
    }
    
    void Test::f(int num)
    {
    	cout << "not void" << endl;
    }
    
    int main(void)
    {
    	Test ob;
    	void(Test::*pf)(void) = &Test::f;
    	(ob.*pf)();
    	(ob.*pf)(3); //Ошибка "слишком много аргументов для вызова"
    }

    16 июля 2014 г. 20:03

Ответы

  • Все верно. Объявление указателя на функцию содержит информацию о типах параметров и типе возвращаемого значения. Ваш указатель pf может хранить только адреса функций без параметров. Использовать его для вызова обоих перегруженных методов нельзя.

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

    • Помечено в качестве ответа iTiPo 17 июля 2014 г. 8:47
    • Снята пометка об ответе iTiPo 17 июля 2014 г. 8:51
    • Помечено в качестве ответа iTiPo 17 июля 2014 г. 9:22
    17 июля 2014 г. 7:32

Все ответы

  • Все верно. Объявление указателя на функцию содержит информацию о типах параметров и типе возвращаемого значения. Ваш указатель pf может хранить только адреса функций без параметров. Использовать его для вызова обоих перегруженных методов нельзя.

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

    • Помечено в качестве ответа iTiPo 17 июля 2014 г. 8:47
    • Снята пометка об ответе iTiPo 17 июля 2014 г. 8:51
    • Помечено в качестве ответа iTiPo 17 июля 2014 г. 9:22
    17 июля 2014 г. 7:32
  • Спасибо! А как мне поступить, если я хочу вызвать метод с параметром int в данном случае? 
    17 июля 2014 г. 8:48
  • Если непременно нужны указатели на метод, создать еще один указатель. А вообще, методы проще вызывать непосредственно через объект класса :)

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

    17 июля 2014 г. 9:18
  • Спасибо большое :)
    17 июля 2014 г. 9:22