覆盖每个实例的函数c ++

时间:2017-12-28 13:23:17

标签: c++

所以,我试图做的是: 我想创建一个带有函数MyCLASS的通用类genericFunction(),默认情况下为空。现在,当一个同事想要使用这个泛型函数时,他所做的是创建一个MyClass的实例,并覆盖genericFunction(),所以它应该给出一个类似于此的resoult:

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()。问题是,对于每个实例,执行的函数可能(或实际上应该)是不同的。这个想法受到启发&#39;通过android的clickListener,其中每个元素在单击时都有不同的函数

再次感谢!

1 个答案:

答案 0 :(得分:6)

如果您希望能够为类对象设置用户定义的函数,则可以为其指定类型为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';
}