每个实例C 的覆盖功能

overriding function for each instance c++

本文关键字:覆盖 功能 实例      更新时间:2023-10-16

所以,我要做的是:我想创建一个具有函数genericFunction()的通用类MyCLASS,该函数默认情况下是空的。现在,当同事想使用此通用函数时,他所做的就是创建MyClass的实例,并覆盖genericFunction(),因此它应该给出与此相似的重新估计:

class MyClass{
   public:
      void genericFunction(){
         //boring default actions
      }
      //constructor
      MyClass(){
         //do things
      }
};

int main(){
   MyClass instance();
   //now we override the function, something like:
   instance.genericFunction(){
      cout << "This new code exists only for this instance, and has been created outside the class!";
   } 
   instance.genericFunction();
   return 0;
}

,这基本上就是我想做的。

在不可能的情况下,我该如何使我的类运行一个将在main()中定义的函数?

非常感谢!

编辑:回答您的问题:

*我是C 的新手,确实是我的背景来自其他语言*想法是:您正在创建具有位置的对象,如果位置在一定范围内,则执行genericFunction()。问题是对于每个实例,执行的函数可能(或实际上应该)不同。这个想法是由Android的ClickListener"启发"的,每个元素在单击

时都有不同的函数要执行

再次感谢!

如果要设置类对象的用户定义的函数,则可以给它一个类型std :: function的成员变量。使用示例中的语法略有不同,看起来像这样:

class MyClass
{
public:
    std::function<void()> genericFunction = []{};
};
int main()
{
    MyClass instance;
    instance.genericFunction(); // does nothing
    // assign a lambda function to our
    // function member
    instance.genericFunction = []
    {
        std::cout
            << "This new code exists only for this instance, and has been created outside the class!";
    };
    instance.genericFunction(); // executes our lambda function
}

编辑

如果您想通过参数或接收返回值,则将模板签名更改为std::function

class MyClass
{
public:
    // take a string parameter and return an integer    
    std::function<int(std::string const&)> genericFunction = [](std::string const&){ return 0; };
};
int main()
{
    MyClass instance;
    int return_value;
    return_value = instance.genericFunction("This will do nothing and return 0"); // does nothing
    std::cout << "The first function returned: " << return_value << 'n';
    // assign a lambda function to our
    // function member
    instance.genericFunction = [](std::string const& msg)
    {
        std::cout << msg << 'n';
        return 5;
    };
    return_value = instance.genericFunction("This will pint a message and return 5"); // executes our lambda function
    std::cout << "The second function returned: " << return_value << 'n';
}