@mrbbfst

Как создать указатель-член класса на функцию-член и вызввать её вне класса?

class MyClass {
public:
//указатель на funk котоый я буду вызввать и вутри класса и вне его
private:
int func(int);
int func1(int);
int func2(int);
}


Указатель нужен так как есть несколько функций похожих. при инициализации объекта класса, указывается какая именно будет использоваться, и в конструкторе указатель должен быть инициализирован funk1, funk2 или funk

Как его объявить и инициализировать?
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как его объявить и инициализировать?

int (MyClass::*p)(int);
p = &MyClass::func;


и вызввать её вне класса

MyClass *o;
...
(o->*(o->p))(42);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
У вас странный подход. Общепринятое решение - создать базовый класса с виртуальным методом, который переопределять в потомках. Тогда выбор необходимого метода будет происходить на основе типа
#include <iostream>
#include <string>
#include <functional>

class BaseVirtual{
private:
    virtual int func(int v) = 0;
public:
    int runFunc(int v){return func(v);};
    virtual ~BaseVirtual() = default;
};

class MyClass: public BaseVirtual{
private:
    int func(int v) override {
        return v * 42;
    };
public:
    MyClass(){}   
    ~MyClass(){
        std::cout << "destructed MyClass" << std::endl;    
    };
};

class MyClass2: public BaseVirtual{
private:
    int func(int v) override {
        return v * 42 * 2;
    };
public:
    MyClass2(){}   
    ~MyClass2(){
        std::cout << "destructed MyClass2" << std::endl;    
    };
};

int main()
{
    BaseVirtual *c = new MyClass();
    std::cout << c->runFunc(2) << std::endl;
    delete c;
    
    c = new MyClass2();
    std::cout << c->runFunc(2) << std::endl;
    delete c;
    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы