如何使用函数指针初始化类中的对象?

时间:2013-10-11 21:28:23

标签: c++ constructor function-pointers

我有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类中的函数。有什么建议吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您传递的函数指针是类成员函数,其类型为int(Container::*)(myType),这会导致问题。

如果funct函数不需要Container对象中的信息,则可以将其设置为静态。如果它确实需要访问该对象,那么您要么将参数的类型更改为std::function<int(Container&,myType)>并将该函数与对象一起使用。或者将其更改为std::function<int(int)>并通过std::bind传递函数。

答案 1 :(得分: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){;}