簡體   English   中英

Arduino-C ++對象構造函數錯誤

[英]Arduino - C++ Object Constructor Error

我正在嘗試調試一些arduino代碼,並不斷獲取與對象構造函數相關的錯誤。 我相信我已經正確定義了所有內容並提供了正確的輸入,但是我仍然無法編譯代碼。

我在下面粘貼了錯誤和代碼。 請注意,我已經刪除了“數據控件”類中的某些源代碼。 另請注意,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;    
}

您必須先調用其構造函數才能創建對象。 因為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();
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM