将非静态函数作为参数

时间:2017-04-04 19:54:36

标签: c++ callback arduino

我已经阅读了这个问题How do you pass a non static function as callback

但我仍然感到困惑,(可能是因为我的英语知识= /)

我尝试使用全局实例化对象指针将非静态函数作为另一个函数的参数传递。

请考虑以下示例: 的 Classe_Indice.h

#ifndef CLASSE_INDICE
#define CLASSE_INDICE

#include <Arduino.h>
#include <Programas.h>

class Classe_Indice: public Programas
{

    public : int incrementaEvento();
             int incrementaFert();
             void setNumeroEvento(int numeroEvento);
             int getNumeroEvento();
             void setNumeroFert(int numeroFert);
             int getNumeroFert();

    private : int numeroEvento;
              int numeroFert;  

};



#endif

Programas.h

    #include <RTClib.h>
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>

/*Biblioteca de Lista Encadeada*/
#include <LinkedList.h>

#include <Classe_Indice.h>
#include <Fertilizantes.h>
#include <Eventos.h>
#include <Agendamentos.h>
#include <RecuperaIrriga.h.> 
#include <RecuperaFerti.h>

class Programas: public Thread
        {
            public :   bool shouldRun();
                       void verificaProgramacao();


            private :  unsigned long tempo;
                       DateTime now;


        };


#endif

Main.cpp的

#include "Thread.h"
#include "ThreadController.h"
#include <Classe_Indice.h>
#include <Programas.h>

Classe_Indice *indice = new Classe_Indice();
ThreadController cpu;
Programas programacao = Programas();

int main()
{
    programacao.setInterval(200);
    programacao.onRun((indice->verificaProgramacao()));
    cpu.add(&programacao);
}

请注意,在Classe_Indice.h中,我正在扩展Programa ...我之所以这样做是因为我收到了以下错误:错误:&#39; class Classe_Indice&#39;没有名为&#39; verificaProgramacao&#39;的成员。然后问题变为无效使用void表达式 ..将synthax更改为programacao.onRun((* indice-&gt; verificaProgramacao())),我得到:错误:void值不会被忽略,因为它应该是

我真的不知道如何继续这个。很抱歉,无论如何这都是双重的。

2 个答案:

答案 0 :(得分:0)

COMMENT :::

1,试试

     (*indice).verificaProgramacao();

2,

       programacao.onRun(some parameter)

然而,这个功能,              void verificaProgramacao();            不是返回类型函数。

答案 1 :(得分:0)

我不确定你的意图。我想你希望在另一个线程中调用/执行verificaProgramacao()并尝试将其作为参数传递。 实际上,通过以下方式:

programacao.onRun((indice->verificaProgramacao()));

您正在传递执行结果而不是函数/方法本身。根据类Programas中的声明,函数返回void,即没有:

void verificaProgramacao();

所以你有错误。

我不知道Thread类的定义,但我想你应该重载onRun方法(继承自Thread我猜){{1}在Programas的重新实现中调用verificaProgramacao类,或者将指向onRun的指针传递给verificaProgramacao类对象的构造函数,然后传递给{{1}的构造函数如果类允许这个(如果有适当的构造函数)。

为了帮助您,我需要更多详细信息,尤其是关于Classe_Indice课程和您的实际意图。