2015-12-09 33 views
5

İki motoru kontrol etmek için çok basit bir Arduino sınıfı yazıyorum. Arduino Sınıf Oluşturucum neden bir argüman gerektiriyor?

benim başlık dosyası Motor.h içine basit bir sınıf tanımı var: benim ana kütüphane dosyası, Motor.cpp yılında

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; 
}; 

, aşağıdaki Sınıf yapıcı vardır:

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

Sınıfımı birincil programımda başlatmayı denedim:

Aşağıdakileri alıyorum: derleme hatası:

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()' 

şaşırtıcı bir parçası olduğunu böyle Motorlu Sınıf kurucusuna hatta bir çöp, ıskarta argüman eklerseniz:

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

Ve .cpp dosyasında:

Motor::Motor(int garbage) { } 

Ve benim ana dosyasında:

Motor motor(1); 

Her şey şikayet olmadan mükemmel çalışır. Arduino forumlarında biraz araştırma yaptım, ancak bu garip davranışları açıklayacak hiçbir şey bulamadım. Sınıf kurucusu neden bir argüman gerektiriyor? Bu, AVR'ye ya da başka bir şeye bağlı tuhaf bir kalıntı mı?

cevap

8

"En çok rahatsız edici ayrıştırma" sorununa girdiniz (bunun nedeni, çünkü rahatsız edici olduğu için).

Motor motor(); parametre almayan ve bir Motor döndüren motor adında bir işlev beyan eder. (Resim int test(); farklı ya da benzer)

bir parantez Motor motor; kullanın motor adı Motor bir örneğini tanımlamak için. C++ 11 "tek tip başlatma" sözdizimini kullanabilirsiniz yana

: kabul edilen yanıt istinaden ilave olarak

+0

vardır. Ne garip bir böcek. Bir ton teşekkürler. –

3

. Fonksiyonel forma göre tek tip başlatmanın bir avantajı, parantezlerin sizin durumunuzda gerçekleşen işlev bildirimleriyle karıştırılamayacağıdır. Sözdizimi {} numaralı ayraçları kullanmanız dışında, işlevsel olanı gibi kullanılabilir.

Çok sıkı sallayın bazı iyi örnekler over here

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

Bahşiş için teşekkürler. Bunu takdir ediyorum. –

İlgili konular