Как использовать указатели на функции для инициализации объекта внутри класса?

0

У меня есть 3 класса - суперкласс, подкласс и класс контейнера. Мой суперкласс имеет следующий конструктор:

Superclass(char* t,int(*i)(myType),int a,int b,int c,int p){
    T=t;
    I=i;
    A=a;
    B=b;
    C=c;
    P=p;
}

И конструктор подкласса:

Subclass(char* t,int(*i)(myType),int a,int b,int c,int p)
  : Superclass(t,i,a,b,c,p){;}

Класс контейнера содержит несколько указателей на объекты типа подкласса:

class Container{
  public:
    char x[2000];
    int funct(myType);
    ...
    Subclass* S;
    ...
    Container(){
      S= new Subclass(x,&funct,3,4,2000,0);
      ...
    }
}

Я получаю ошибку компилятора в приведенной выше строке "S = new..." с сообщением:

"Error: No instance of 'Subclass::Subclass' matches the argument list
argument types are: (char[2000],int(Container::*)(myType),int,int,int,int)"

Я считаю (хотя я не уверен), что ошибка имеет какое-то отношение к передаваемому указателю функции. Я использовал функцию ptrs аналогичным образом, но, похоже, это не так, что она указывает на функцию внутри класса Container. Какие-либо предложения?

Заранее спасибо за помощь.

Теги:
function-pointers
constructor

2 ответа

0
Лучший ответ

Вы не можете передавать функцию-член как простой указатель функции, если только она не является статической функцией-членом.

static int funct(myType);

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

Вы также можете изменить тип указателя, переданного конструктору, как указатель на член, но это гораздо более важно и обычно не полезно, если вы также не передаете объект такого типа.

Subclass(char* t,Container* cp, int((Container::*)i)(myType),int a,int b,int c,int p)
  : Superclass(t,cp,i,a,b,c,p){;}
0

Указатель функции, который вы передали, является функцией члена класса, которая имеет тип int(Container::*)(myType), что вызывает проблему.

Если функция funct не нуждается в информации из объекта Container, вы можете сделать ее статической. Если действительно нужен доступ к объекту, то вы либо хотите изменить тип параметра на std::function<int(Container&,myType)> и использовать эту функцию с объектом. Или измените его на std::function<int(int)> и передайте функцию через std::bind.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню