【问题标题】:C++: Pass interface as parameter like in JavaC ++:像在Java中一样将接口作为参数传递
【发布时间】:2016-02-09 00:58:45
【问题描述】:

我想用 C++ 做一些我可以用 Java 做的东西。这是我的 Java 代码:

interface Worker
{
    public void work();
}

class Employer
{
    public void askForWork(Worker worker)
    {
        worker.work();
    }
}

public class Main
{
    public static void main(String[] args)
    {
        Employer employer = new Employer();
        employer.askForWork(new Worker()
        {
            @Override
            public void work()
            {
                System.out.println("I'm working!");
            }
        });
        employer.askForWork(new Worker()
        {
            @Override
            public void work()
            {
                System.out.println("I'm working too!");
            }
        });
    }
}

我想用 C++ 来做。能够在函数调用中实现接口对我来说非常重要。有可能吗?

【问题讨论】:

  • 显示你目前写的代码。
  • 查找抽象基类和虚方法。
  • 显示您编写的 C++ 代码。
  • 我写了 Object class(pastebin.com/XgVYbbny) 并按如下方式调用它:pastebin.com/yJLVsT8E 但是使用这种方法我不能在 lambdas 中提供任何变量。
  • 我也写了这个:更新程序类(pastebin.com/vrUAcpLM)和它的用法(pastebin.com/sxg7M882)。但是正如你所看到的,我不能在函数调用中实现派生类:(

标签: java c++ c++11 lambda interface


【解决方案1】:

一种方法是使用 std::function。

class Worker {
 public:
  explicit Worker(std::function<void()> task)
      : task_(task) {}

  void Work() {
    task_();
  }

 private:
  std::function<void()> task_;
};

class Employer {
  ...

  void AskForWork(std::unique_ptr<Worker> worker) {
    worker->Work();
  }
};

int main(...) {
  Employer employer;
  employer.AskForWork(new Worker(
    []() {
      std::cout << "I'm working!" << std::endl;
    }
  ));
}

【讨论】:

  • 是的,我已经这样做了,但是我怎样才能提供在这个函数内部不会改变的变量呢?
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 2017-05-29
  • 2011-02-02
  • 1970-01-01
  • 2016-11-22
  • 2011-12-04
  • 2018-09-05
  • 2020-12-20
相关资源
最近更新 更多