2015-12-09 13 views
5

Sto scrivendo una classe Arduino molto semplice per controllare due motori.Perché il mio Costruttore di classe Arduino richiede un argomento?

Ho una semplice definizione di classe all'interno del mio file di intestazione Motor.h:

class Motor 
{ 
    public: 
    Motor(); 
    void left(int speed); 
    void right(int speed); 
    void setupRight(int rightSpeed_pin, int rightDirection_pin); 
    void setupLeft(int leftSpeed_pin, int leftDirection_pin); 
    private: 
    int _rightMotorSpeedPin; 
    int _rightMotorDirectionPin; 
    int _leftMotorSpeedPin; 
    int _leftMotorDirectionPin; 
}; 

Nel mio file biblioteca principale, Motor.cpp, ho il seguente costruttore di classe:

Motor::Motor() { 
    // Intentionally do nothing. 
} 

Quando io cerco di inizializzare la mia classe nel mio programma primaria con la linea:

ottengo il seguente errore di compilazione:

MotorClassExample.ino: In function 'void setup()': 
MotorClassExample:7: error: request for member 'setupRight' in 'motor', which is of non-class type 'Motor()' 
MotorClassExample:8: error: request for member 'setupLeft' in 'motor', which is of non-class type 'Motor()' 
request for member 'setupRight' in 'motor', which is of non-class type 'Motor()' 

La parte sconcertante è che se includo anche un bidone della spazzatura, argomento usa e getta al costruttore della classe del motore come questo:

class Motor 
{ 
    public: 
     Motor(int garbage); 
     ... 

E nel file cpp:

Motor::Motor(int garbage) { } 

E nel mio file principale:

Motor motor(1); 

Tutto funziona perfettamente senza lamentarsi. Ho fatto un bel po 'di ricerche nei forum di Arduino, ma non ho trovato nulla per spiegare questo strano comportamento. Perché il costruttore della classe richiede un argomento? Questa è una strana reliquia legata all'AVR o qualcosa del genere?

risposta

8

Ti sei imbattuto nel problema del "problema più irritante" (chiamato così perché è fastidioso, ovviamente).

Motor motor(); dichiara una funzione chiamato motor che non accetta argomenti e restituisce un Motor. (Diverso da int test(); o simili)

Per definire un'istanza di Motor chiamato motor, utilizzare Motor motor; senza parentesi.

+0

è rock così difficile. Che bizzarro bug. Grazie mille. –

3

In aggiunta alla risposta accettata:

Dal C++ 11 è possibile utilizzare la sintassi "di inizializzazione divisa". Un vantaggio dell'inizializzazione uniforme rispetto alla forma funzionale è che le parentesi non possono essere confuse con le dichiarazioni di funzione, che sono avvenute nel tuo caso. La sintassi può essere utilizzata come quella funzionale, tranne per il fatto che si utilizzano le parentesi graffe {}.

Ci sono alcuni buoni esempi over here

Rectangle rectb; // default constructor called 
Rectangle rectc(); // function declaration (default constructor NOT called) 
Rectangle rectd{}; // default constructor called 
+0

Grazie per il suggerimento. Lo apprezzo. –

Problemi correlati