C++ 在C+中使用抽象类+;对于高阶函数

C++ 在C+中使用抽象类+;对于高阶函数,c++,virtual-functions,C++,Virtual Functions,首先,我知道答案就在某处,但我整个上午都在寻找,没有找到 我的问题涉及Java中的内容 abstract class AbstractWorker { public abstract int doIt(); } class Thinker extends AbstractWorker { public int doIt() { return 42; } } class Milkmaid extends AbstractWorker { public int doIt() { re

首先,我知道答案就在某处,但我整个上午都在寻找,没有找到

我的问题涉及Java中的内容

abstract class AbstractWorker {
  public abstract int doIt();
}

class Thinker extends AbstractWorker {
  public int doIt() { return 42; }
}

class Milkmaid extends AbstractWorker {
  public int doIt() { return 1 + 2; }
}

class Worker {
  public int getWorkDone(AbstractWorker worker) {
    return worker.doIt();
  }
}
我认为这也应该是C++中的。但我如何实现这一点?我的方法看起来像

struct AbstractWorker {
  virtual int doIt() = 0;
};

struct Thinker : public AbstractWorker {
  int doIt() { return 42; }
};

struct Milkmaid : public AbstractWorker {
  int doIt() { return 1 + 2; }
};

struct Worker {
  int getWorkDone(AbstractWorker &worker) {
    return worker.doIt();
  }
};

这个怎么了?或者你会如何解决这个问题?

如果真的只有一个成员函数,我会用functors实现它,并将
getworkone
作为模板

struct Worker {
  template<typename F>
  auto getWorkDone(F f) -> decltype(f())
  { return f(); }
};
函子也可用于维护状态:

template<typename Func>
struct Worker {
  Worker(Func f = Func()) : f_(f) {}

  auto getWorkDone() -> decltype(f_())
  { 
    // do something with the state in f_
    return f_(); 
  }

private:
  Func f_;
};
模板
结构工人{
辅助函数(Func f=Func()):f_z(f){}
auto getWorkDone()->decltype(f_())
{ 
//对f中的状态做些什么_
返回f_();
}
私人:
Func f_;
};

我的问题有点可疑。事实上,我发布它的速度有点快。无论如何,我希望有人会觉得这很有用

谢谢你的回复。我完善了我的示例,以下内容将实际编译并运行:

#include <iostream>

struct AbstractWorker {
  virtual ~AbstractWorker() {};

  virtual int doIt() = 0;
};

struct Thinker : public AbstractWorker {
  int doIt() { return 42; }
};

struct Milkmaid : public AbstractWorker {
  int doIt() { return 1 + 2; }
};

struct Worker {
  int getWorkDone(AbstractWorker &worker) {
    return worker.doIt();
  }
};

int main() {
  Thinker work1;
  Milkmaid work2;
  Worker worker;

  std::cout << "result of work1: " << worker.getWorkDone(work1) << std::endl;
  std::cout << "result of work2: " << worker.getWorkDone(work2) << std::endl;

  return 0;
}
#包括
结构抽象工作者{
虚拟~AbstractWorker(){};
虚拟int doIt()=0;
};
结构思想者:公共抽象工作者{
int doIt(){return 42;}
};
struct Milkmaid:公共抽象工作者{
int doIt(){return 1+2;}
};
结构工人{
int getWorkDone(AbstractWorker和worker){
return-worker.doIt();
}
};
int main(){
思想家工作1;
挤奶女工2人;
工人;

std::cout Milkmaid不是从AbstractWorker继承的,但我看不出它有任何其他问题。您需要为
AbstractWorker
创建一个虚拟析构函数,
Milkmaid
应该从
AbstractWorker
继承。除此之外,它看起来还不错。您可能希望创建方法
const
,并传递一个
constD> >参考<代码> GETWorksOndo/Cuth>,但这是一个独立的问题。为什么不使用类而不是Stutt?编译C++代码时会得到什么样的错误?@ MRZ没有理由使用<代码>类< /COD>而不是<代码> Stutt<代码>(除了个人偏好之外)。我也会问你同样的问题。这有什么错?是的,如果场景真的那么简单,你可以这么做。这样会更快,也可能更容易。但我需要Worker对象的状态。@ArneL。这似乎并不难。函子可以有状态。这是函数的主要优点之一。你也可以编写自己的概念。是的有些东西非常类似于函子,但有一些额外的成员函数用于状态。也许你可以在你的问题中添加一个带有状态的示例。我的答案是正确的,你的问题只是省略了要求;-)+1,以提供一个很好的替代方案。按状态我指的是AbstractWorker的子类。例如,我的实际问题涉及在这一点上随机生成状态。
#include <iostream>

struct AbstractWorker {
  virtual ~AbstractWorker() {};

  virtual int doIt() = 0;
};

struct Thinker : public AbstractWorker {
  int doIt() { return 42; }
};

struct Milkmaid : public AbstractWorker {
  int doIt() { return 1 + 2; }
};

struct Worker {
  int getWorkDone(AbstractWorker &worker) {
    return worker.doIt();
  }
};

int main() {
  Thinker work1;
  Milkmaid work2;
  Worker worker;

  std::cout << "result of work1: " << worker.getWorkDone(work1) << std::endl;
  std::cout << "result of work2: " << worker.getWorkDone(work2) << std::endl;

  return 0;
}