【问题标题】:C++ assign member object function to class member functionC ++将成员对象函数分配给类成员函数
【发布时间】:2017-09-16 06:02:30
【问题描述】:

有没有办法使用 = 类型赋值来代替这种语法:

void triggerAttack() { adsr.triggerAttack(); }

我希望做类似的事情:

void triggerAttack() = adsr.triggerAttack

std::function<void()> triggerAttack = adsr.triggerAttack

void(*triggerAttack)() = adsr.triggerAttack

但没有编译!

示例代码:

class LinearADSR
{
public:
    void triggerAttack() { }    
};

class JerobeamBlubb : public gen
{
public:
    void triggerAttack() { adsr.triggerAttack(); }

protected:
    LinearADSR adsr;
};

【问题讨论】:

  • 你想达到什么目的? 1) 失败是因为语法无效 2) 和 3) 失败是因为你有成员函数,而不是普通函数(并且你使用实例来获取它们)
  • 只是让继承某些函数变得简单,所以我不必将每个函数从一个类重写到另一个类。我没有使用子类,因为我只需要几个函数。但我可能会经常重复这种事情,这是无法避免的。每个班级都需要各种定制。

标签: c++ function class oop object


【解决方案1】:

一般来说,成员函数指针不同于通常的指针,因为它必须与其类的实例一起使用。

所以把你的代码改成这样:

class LinearADSR
{
public:
    void triggerAttack() { }    
};

class JerobeamBlubb
{
public:
    void (LinearADSR::*triggerAttack)();
protected:
    LinearADSR adsr;
};

int main()
{
   JerobeamBlubb a;
   a.triggerAttack = &LinearADSR::triggerAttack; 
}

关于您的失败尝试:

  • void triggerAttack() = adsr.triggerAttack; is invalid syntax
  • std::function<void()> triggerAttack = adsr.triggerAttack 失败,因为 triggerAttack 是成员函数,而不是通常的函数。正如我之前解释的那样,您需要一个它的类的实例。
  • void(*triggerAttack)() = adsr.triggerAttack 失败的原因与上述相同。

【讨论】:

  • 我认为,您遗漏了一个非常重要的部分:如何使用该功能。根据我收集的信息(第一个代码 sn-p),OP 想要这样使用它:a.triggerAttack()
  • 这是真的,你不能这样用吗?
  • std::function 与成员函数一起使用。问题是它要求第一个参数是指向函数被调用对象的指针。如果您在构建时已经知道对象,请使用std::bind
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多