【问题标题】:reference to non-static member function must be called error必须调用非静态成员函数的引用错误
【发布时间】:2019-07-12 11:41:44
【问题描述】:

我正在使用 C++ 创建一个计时器。我查了互联网,但没有找到任何我能理解的东西。这是我的代码:

struct Timer{
  bool timerRunning;
  int time;
  void Timer_Service(void* param){
    timerRunning = true;
    time = 0;
      while(timerRunning){
        wait(10);
        time += 10;
      }
  }
  void startTimer(){
    Timer_Service((void*)"PROS");
    pros::Task timerservice(Timer_Service,(void*)"PROS");// <- error here "reference to non-static member function must be called"
  }
  void stopTimer(){
    timerRunning = false;
  }
  int getTime(){
    return time;
  }
};

我该如何解决这个错误? BTW pros::Task timerservice(Timer_Service,(void*)"PROS"); 是一个初始化多任务循环的函数。 感谢大家的热心帮助。

【问题讨论】:

    标签: c++


    【解决方案1】:

    pros::Task 构造函数takes a function pointer

    函数指针和指向成员函数的指针是not the same thing

    您必须将指针传递给非成员函数(或static 成员),最好是转发委托。您可以创建一个包含Timer_Service* 的类,并通过void* 参数传递它。实际上,在这种情况下,由于您需要传递对象指针,因此不需要包装类。

    struct Timer
    {
      bool timerRunning;
      int time;
    
      static void Timer_Service_Delegate(void* param) {
         Timer* ptr = reinterpret_cast<Timer*>(param);
         ptr->Timer_Service();
      }
    
      void Timer_Service() {
        timerRunning = true;
        time = 0;
          while(timerRunning){
            wait(10);
            time += 10;
          }
      }
    
      void startTimer() {
        pros::Task timerservice(
           Timer_Service_Delegate,
           reinterpret_cast<void*>(this)
        );
      }
    
      void stopTimer() {
        timerRunning = false;
      }
    
      int getTime() {
        return time;
      }
    };
    

    我怀疑您还需要将pros::Task 保持在范围内,但我对图书馆的了解还不够,无法就此培训您。请参阅其文档。

    【讨论】:

    • 但是,我想为每个定时器创建 timer_service,如果使用静态成员,它只会为类创建 timer_service,而不是每个对象
    • @EdenCheung 不,这就是委托的指针参数的用途。
    • 哦,现在我看到了,我的浏览器没有正确渲染整个内容。非常感谢!
    • @EdenCheung 没问题。这是将类 C 回调 API 与 C++ 代码混合使用的常见模式,因此您会再次遇到它!
    • @EdenCheung 永远是你/我们应该做的第一件事!这就是它的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多