如何通过重载将成员函数分配给成员函数指针?

时间:2014-02-11 21:36:05

标签: c++ overloading

如何在C ++中分配重载到其他成员函数(或函数指针)的成员函数?

我的目标是包装成员函数。我有以下代码,它不起作用,因为它有2“做”。我想要做的是将Do1Do2Dodouble *一起包裹到double **。因此,我只能Do运行,而不需要关心Do1Do2。 (也许,我应该指定需要在Do1Do2之间选择的条件。)

class Sample { 
    int (*Do)(double *arr);
    int (*Do)(double **arr);
    int Do1(double *arr);
    int Do1(double **arr);
    int Do2(double *arr);
    int Do2(double **arr);
};

或者你对这个目标有什么建议吗?

补充:对于Thomas,函数对象(仿函数)是一个好主意,但它只能解决重载问题。我想选择功能(例如,Do1Do2)。我有几个规定的功能,我可以选择其中一个到Do。但是,我还想将自定义函数分配给Do。 例如,当我运行Do时,我可以运行Do1Do2或我自己的新自定义函数。 (我应该设置当我创建实例时将执行的函数)

和..我不能在我的情况下使用C ++ 11。 (我想,但我的服务器有较旧的GCC版本)

1 个答案:

答案 0 :(得分:1)

您的代码格式错误,无法编译。你可以重载函数,但不能重载对象!也就是说,你不能有两个名为'Do'的不同类型的指针。我记不起来了,但是MSVC会告诉你这样的事情:

  

'Sample :: Do':重新定义;不同的基本类型

如果你想做类似的事情,你可以使用flag:

class Sample
{
    int Do(double *arr);
    int Do(double **arr);
    int Do1(double *arr);
    int Do1(double **arr);
    int Do2(double *arr);
    int Do2(double **arr);

    void SetDoVersion(int version);

    int _do_version;
};

'Do'看起来像这样:

int Sample::Do(double *arr)
{
  //For more than 2-3 versions you could also use switch().
  if(this->_do_version == 1)
    return this->Do1(arr);
  else
    return this->Do2(arr);
}

int Sample::Do(double **arr)
{
  //same as above
}

SetDoVersion()设置当前“已安装”的版本:

void Sample::SetDoVersion(int version)
{
  this->_do_version = version;
}

这可能是完成此任务的最简单的解决方案。