2017-04-04 56 views
0

我讀過這個問題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中,我擴展了Programas ...我做了這個,因爲我得到以下錯誤:錯誤:'class Classe_Indice'沒有名爲'verificaProgramacao'的成員。然後問題改爲無效使用void表達式 ..將合成器更改爲programacao.onRun((indice-> verificaProgramacao())),我會得到:錯誤:void值不會被忽略,因爲它應該是

我真的不知道如何處理這個問題。對不起,如果這是一個反正無論如何。

+0

'onRun'的聲明/定義是什麼?它沒有出現在你的代碼中。但是'indice-> verificaProgramacao()'已經調用函數,它不會將其作爲參數 – UnholySheep

+0

在成員函數指針上讀取。 – AndyG

回答

0

COMMENT :::

1,儘量

 (*indice).verificaProgramacao(); 

2,

 programacao.onRun(some parameter) 

,但是,功能, 空隙verificaProgramacao(); 不是返回類型函數。

0

我不確定你的意圖。我想你想在另一個線程中調用/執行verificaProgramacao(),並嘗試將它作爲參數傳遞。 其實,以下列方式:

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

你逝去的執行,而不是函數/方法本身的結果。根據類聲明Programas該函數返回void,即什麼:

​​

讓你有一個錯誤。

我不知道Thread類的定義,但我想你要麼在Programas類重載onRun方法(從Thread繼承我猜),並在onRun重新實現來電verificaProgramacao,或傳遞指向verificaProgramacao指向Classe_Indice類構造函數的對象,然後指向Thread的構造函數,如果類允許的話(如果存在適當的構造函數)。

爲了幫助你,我需要更多的細節,特別是關於Thread課程和你的實際意圖。

+0

非常感謝你的努力。我試圖在onRun中使用verificaProgramacao作爲回調函數。爲了做到這一點,我需要它作爲onRun方法的參數,因爲verificaProgramacao是一個非靜態函數,我將它傳遞給一個指向object的指針(在本例中稱爲indice)。我在這裏使用這個庫:https://github.com/ivanseidel/ArduinoThread – Rezik

+0

onRun()調用一個線程函數,當它應該執行時,這個線程函數就是verificaProgramacao。我試圖不要多餘。希望你明白這一點,隨時提問。 – Rezik

+0

我理解你的想法,但是:爲什麼你想調用一個類中定義的函數/方法?你真的想讓回調函數在'Programas'類的某個實例上運行嗎?可以爲一個對象調用「verificaProgramacao」,而「onRun」不能訪問該對象。 'verificaProgramacao'必須在類的外部或類中定義爲靜態組件。在後一種情況下,它不能在類的實例變量上操作,只能在靜態變量上操作。 –

相關問題