2015-07-13 176 views
1

我試圖調試我的一些arduino代碼,並不斷收到與對象構造函數關聯的錯誤。我相信我已經正確定義了所有內容並提供了正確的輸入,但我仍然無法獲得編譯代碼。Arduino - C++對象構造函數錯誤

我粘貼下面的錯誤和代碼。請注意,我已在「數據控制」類中刪除了一些我的源代碼。另請注意,CDOS_Info是我創建的一個結構體。

感謝您的幫助!

錯誤:

Arduino: 1.6.5 (Windows 7), Board: "Arduino Uno" 

C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\StateController.cpp: In constructor 'StateController::StateController(CDOS_Info*)': 
C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\StateController.cpp:19:58: error: no matching function for call to 'DataControl::DataControl()' 
    StateController::StateController(CDOS_Info *inputtedInfo) 
                 ^
C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\StateController.cpp:19:58: note: candidates are: 
In file included from C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\StateController.h:16:0, 
       from C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\StateController.cpp:13: 
C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\DataControl.h:19:3: note: DataControl::DataControl(CDOS_Info*) 
    DataControl(CDOS_Info *inputtedInfo); 
^
C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\DataControl.h:19:3: note: candidate expects 1 argument, 0 provided 
C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\DataControl.h:16:7: note: DataControl::DataControl(const DataControl&) 
class DataControl 
    ^
C:\Users\A5KW5ZZ\Desktop\arduino-1.6.5-r2-windows\arduino-1.6.5-r2\libraries\CDOS\DataControl.h:16:7: note: candidate expects 1 argument, 0 provided 
Error compiling. 

    This report would have more information with 
    "Show verbose output during compilation" 
    enabled in File > Preferences. 

代碼

主營:

/*********************************************** 
*********** Import Libraries ****************** 
***********************************************/ 

    #include "CDOS_Definitions.h" 
    #include "ConfigInit.h" 
    #include "SensorSerialInterface.h" 
    #include "StateController.h" 
    #include "OutputInterface.h" 
    #include <SoftwareSerial.h> 

/*********************************************** 
******* Declare datatypes/objects ************* 
***********************************************/ 

    CDOS_Info info;          // Datatype holds general information regarding the CDOS 
    CDOS_Info * infoPointer = &info;      // Declare and define a pointer of the CDOS_Info datatype 
    ConfigInit configInit(infoPointer);     // Configures & initializes the CDOS 
    SensorSerialInterface sensorInterface(infoPointer); // Controls the communications between the Arduino and IMU  
    StateController stateController(infoPointer);   // Transitions the CDOS between various states 
    OutputInterface outputMessage(infoPointer);   // Outputted serial message providing status information to a computer terminal 

/*********************************************** 
*************** Main Program ***************** 
***********************************************/ 

void setup(){ 
    configInit.config(); 
    configInit.init(); 
    sensorInterface.setAllOutput(); // Force IMU to output status of accelerometer, gyroscope, and magnetometer 
} 

void loop(){ 
    sensorInterface.readAll(info.accelXYZ, info.gyroXYZ, info.magXYZ); // Get sensor data 
    stateController.routine();           // Jump into state transition logic 
    outputMessage.outputSerial();          // Output CDOS status info 

} 

狀態控制器標題:

#ifndef StateController_h 
#define StateController_h 

#include "CDOS_Definitions.h" 
#include "InputInterface.h" 
#include "DataControl.h" 
#include "LEDController.h" 

class StateController 
{ 
    public: 
     StateController(CDOS_Info *inputtedInfo); 
     void routine(void); 

    private: 
     CDOS_Info *info;    // create copy of CDOS_Info pointer that member functions can access and modify 
     InputInterface userInput;  // Create input interface object 
     DataControl dataControl;  // Create data control object 
     LEDController lightController; // Controls the LEDs on the CDOS 
}; 

#endif 

狀態控制器源代碼:

#include "Arduino.h" 
#include "CDOS_Definitions.h" 
#include "StateController.h" 
#include "LEDController.h" 
#include "InputInterface.h" 
#include "DataControl.h" 


StateController::StateController(CDOS_Info *inputtedInfo) 
{ 
    info = inputtedInfo; 
    userInput = InputInterface(); 
    dataControl = DataControl(info); 
    lightController = LEDController(); 
} 

void StateController::routine(void) 
{ 
    int static previousTime; 
    int currentTime = millis(); 
    bool static startTime = false; 
    int teachTime = 5000; 

    // State 0 - Start Up State 
    if(info->currentState == 0) 
    { 
     // Transition Case 
     if(userInput.getDigitalInput()) 
     { 
      info->currentState = 3; 
      previousTime = currentTime; 
     } 

     // Lighting 
     lightController.setLightConfig0(); 
    } 

    // State 1 - Disturbed State 
    else if(info->currentState == 1) 
    { 
     // Transition Case 
     if(userInput.getDigitalInput()) 
     { 
      info->currentState = 3; 
      previousTime = currentTime; 
     } 

     // Compute vertical angle 
     dataControl.calculateVerticalAngle(); 

     // Lighting 
     lightController.setLightConfig1(); 
    } 

    // State 2 - Faulted State 
    else if(info->currentState == 2) 
    { 
     // Haven't created any cases where the system can fault yet, will finish later 

     // Lighting 
     lightController.setLightConfig2(); 
    } 

    // State 3 - Teaching State 
    else if(info->currentState == 3) 
    { 

     // Transition Case 
     if(abs(currentTime - previousTime) > teachTime) 
     { 
      info->currentState = 4; 
      dataControl.teachNewPosition(); 
     } 

     // Lighting 
     lightController.setLightConfig3(); 
    } 

    // State 4 - Taught State 
    else if(info->currentState == 4) 
    { 
     // Transition Case 
     if(dataControl.checkPosition()) 
     { 
      info->currentState = 1; 
     } 

     // Compute vertical angle 
     dataControl.calculateVerticalAngle(); 

     // Lighting 
     lightController.setLightConfig4(); 
    }  
} 

數據控制頭:

#ifndef DataControl_h 
#define DataControl_h 

#include "CDOS_Definitions.h" 

class DataControl 
{ 
    public: 
     DataControl(CDOS_Info *inputtedInfo); 
     void teachNewPosition(void); 
     bool checkPosition(void); 
     void calculateVerticalAngle(void);  

    private: 
     CDOS_Info *info; // create copy of CDOS_Info pointer that member functions can access and modify 
}; 

#endif 

數據控件的源代碼:

#include "Arduino.h" 
#include "DataControl.h" 
#include "CDOS_Definitions.h" 
#include "SensorSerialInterface.h" 


DataControl::DataControl(CDOS_Info *inputtedInfo) 
{ 
    info = inputtedInfo;  
} 

回答

2

你不能沒有調用構造函數創建一個對象。因爲StateController也是DataControl,所以如果不調用DataControl的構造函數(以及StateController的),就不能創建一個。但是這個構造函數需要一個參數,所以編譯器不能爲你添加調用。

調用基類的構造函數的方法是修改派生類的構造函數,像這樣:

StateController::StateController(CDOS_Info *inputtedInfo) 
    : DataControl(inputtedInfo) // calls DataControl's constructor 
{ 
    // info = inputtedInfo; // Don't need this, because DataControl's constructor does it. 
    userInput = InputInterface(); 
    dataControl = DataControl(info); 
    lightController = LEDController(); 
} 

,請注意怪異的語法 - 這不完全是一個正常的函數調用。是的,它確實超出大括號。

+0

嗯......這很有趣。我是C++的新手,我正在做什麼?或者我做過的事很常見?我一直在尋找最佳實踐技巧。感謝您的迴應!我會跟進這是否解決了我的問題! – Izzo