2013-10-23 74 views
1

我有類,並使用它如下,但是當我編譯它,我得到錯誤「未定義引用'RemoteControl ::鍵',我不是起訴爲什麼,有人幫我?我覺得這課很簡單,但我不知道爲什麼編譯是錯誤。爲什麼編譯錯誤「未定義的引用」

#include <lnp/lnp.h> 
#include <conio.h> // for the delay() function 
#include <remote.h> 
#include <sys/program.h> 
#include <c++/Motor.H> 
#include <c++/Sound.H> 

extern int remote_control_handler(unsigned int etype, unsigned int key); 
extern int checkMessage(int argc, char **argv); 

class RemoteControl { 
public: 
    static unsigned int key; 

    static const void init() { 
     lr_set_handler(remote_control_handler); 
     execi(&checkMessage, 0, 0, PRIO_NORMAL, DEFAULT_STACK_SIZE); 
    } 
}; 

wakeup_t remote_control_pressed_message(wakeup_t data) { 
    return lnp_rcx_message >= 1 && lnp_rcx_message <= 3; 
} 

int checkMessage(int argc, char **argv) { 
    while (!shutdown_requested()) { 
     clear_msg(); 
     wait_event(&remote_control_pressed_message, 0); 

     if (lnp_rcx_message == 1) { 
      RemoteControl::key = LRKEY_M1; 
     } 
     else if (lnp_rcx_message == 2) { 
      RemoteControl::key = LRKEY_M2; 
     } 
     else if (lnp_rcx_message == 3) { 
      RemoteControl::key = LRKEY_M3; 
     } 
    } 
    return 0; 
} 

int remote_control_handler(unsigned int etype, unsigned int key) { 
    RemoteControl::key = 0; 

    if (etype == LREVT_KEYON) { 
     switch(key) { 
      case LRKEY_STOP: 
      case LRKEY_BEEP: 
      case LRKEY_A1: 
      case LRKEY_A2: 
      case LRKEY_B1: 
      case LRKEY_B2: 
      case LRKEY_C1: 
      case LRKEY_C2: 
       RemoteControl::key = key; 
       break; 

      default: 
       RemoteControl::key = 0; 
       break; 
     } 
    } 
    return 1; 
} 

wakeup_t remote_control_pressed_key(wakeup_t data) { 
    return RemoteControl::key == data; 
} 

wakeup_t remote_control_pressed(wakeup_t data) { 
    return RemoteControl::key != 0; 
} 

int main(int argc, char **argv) { 
    RemoteControl::init(); 
    Motor *m = new Motor(Motor::B); 

    while (!shutdown_requested()) { 
     RemoteControl::key = 0; 
     clear_msg(); 
    wait_event(&remote_control_pressed, 0); 

     if (RemoteControl::key == LRKEY_STOP) { 
      program_stop(1); 
     } 
     else if (RemoteControl::key == LRKEY_A1) { 
      m->forward(); 
     } 
     else if (RemoteControl::key == LRKEY_M1) { 
      Sound::beep(); 
     } 
    } 
    return 0; 
} 
+0

這是BrickOs的代碼嗎? –

回答

1

你只聲明靜態成員變量key,但從來沒有定義它。

它必須在課程之外單獨定義(以及在源文件中):

unsigned int RemoteControl::key; 
相關問題