首页 > 解决方案 > 在 C++ 中动态改变成员函数的行为

问题描述

对于家庭作业,我们需要使用多种不同的算法修改各种图像,并用我们的答案格式化文档。我已经用 C++ 编写了算法,但我想编写一个程序来自动修改图像并格式化文档。为此,我想要一个类的形式

class A
{
    void f1(Image img)
    {
    // do something to the image
    }
    void f2(Image img)
    {
    // do something else to the image
    }
    public:
       void setFunction(bool choice)
       {
          if(choice)
          {
          // define this.operator() = f1
          }
          else
          {
          // define this.operator() = f2
          }
       }
}

我想这样做的原因是因为作业要求我们计算图像的不同属性,但大多数属性在问题中都是重复的。因此,我想写一个表单的函数

void answerQuestion(Image img, A imgProcessor)
{
    // load img, call imgProcessor(img)
    // and get the necessary properties from
    // img to answer the questions
}

这样,我可以imgProcessor.setFunction(choice)在将imgProcessor对象传递给answerQuestion. 我想使用一个对象,因为问题被分成几个部分,所以我希望该imgProcessor对象保留问题其余部分所需的一些信息。我不知道如何动态定义或重新定义该operator()方法,或者是否可能。当然,我对重载调用运算符或仅声明我自己的方法无所谓,但我希望能够在代码中以相同的方式使用此调用。这在 C++ 中可能吗?

标签: c++operator-overloadingmember-function-pointers

解决方案


你必须以某种方式记住选择。在 C++ 中,函数指针和函数对象不参与重载决议,因此您实际上不能用不同的函数替换operator()(),但您当然可以编写operator()()某种类型的条件来检查先前选择的选择并决定调用哪个函数。


推荐阅读