У меня есть 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. Какие-либо предложения?
Заранее спасибо за помощь.
Вы не можете передавать функцию-член как простой указатель функции, если только она не является статической функцией-членом.
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){;}
Указатель функции, который вы передали, является функцией члена класса, которая имеет тип int(Container::*)(myType)
, что вызывает проблему.
Если функция funct
не нуждается в информации из объекта Container
, вы можете сделать ее статической. Если действительно нужен доступ к объекту, то вы либо хотите изменить тип параметра на std::function<int(Container&,myType)>
и использовать эту функцию с объектом. Или измените его на std::function<int(int)>
и передайте функцию через std::bind
.