2015-07-19 219 views
2

我是一個相當有經驗的.net開發人員,但是對於Arduino和C/C++來說,我正嘗試創建我的第一個庫,這是7段LED顯示屏的簡單驅動程序。我有許多頑固的編譯器錯誤,但本着一件事的精神,這是第一次。我想爲我的類添加一個無參數的構造函數,並且當我編譯的庫很好時,但是當我嘗試在草圖中使用該類時,編譯器向我提供了'''seSegmentLed'中成員'setDigit'的相當鈍的請求,非類類型「SevenSegmentLed()」無參數構造函數

最簡單的例子代碼如下:

#ifndef SevenSegmentLed_h 
#define SevenSegmentLed_h 
#include "Arduino.h" 

class SevenSegmentLed 
{ 
    public: 
    void setDigit(int digit); 
    SevenSegmentLed(); 
}; 

#endif 

#include "Arduino.h" 
#include "SevenSegmentLed.h" 

SevenSegmentLed::SevenSegmentLed() 
{ 

} 

void SevenSegmentLed::setDigit(int digit) 
{  

} 

#include "SevenSegmentLed.h" 
SevenSegmentLed sevenSegmentLed(); 

void setup() { 
    sevenSegmentLed.setDigit(4); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 

} 

然而如果我改變構造簽名:SevenSegmentLed(int wtf);並且因此它實例:SevenSegmentLed sevenSegmentLed(1);它編譯就好了。正如參數所說,WTF?

+0

看起來像最令人頭疼的解析的情況下,我可能會添加的東西不會出現在C#中。 'SevenSegmentLed sevenSegmentLed();'這被編譯器解釋爲函數聲明。 – shuttle87

+0

謝謝我認爲它是這樣的,那麼我該怎麼做呢? –

+0

順便說一句,即使你有正確的語法,全局變量*很少*(我幾乎想說永遠不會)在C++中的一個好主意。 –

回答

3

我相信這個問題是這樣的:

SevenSegmentLed sevenSegmentLed(); 

被解釋爲函數聲明,而不是一個初始化。請注意,你不能用c#這個問題,因爲你有new關鍵字爲你消除歧義,所以這個特殊的問題可以避免。

要解決,你可以做兩件事情:

使用C++統一初始化語法(在新ç推出++標準,以避免正是您的問題):

SevenSegmentLed sevenSegmentLed{}; 

或者使用下面的語法:

SevenSegmentLed sevenSegmentLed; 

統一語法的主要優點是它是統一的。因此,舉例來說,如果你有一個構造函數整數你可以寫這樣的:

SevenSegmentLed sevenSegmentLed{1}; 

一般來說統一初始化語法是優選的,當我在我的工作(主要是C#和PHP編寫的C++指南傢伙)我決定這樣做,因爲它是最清楚明確的。

+0

非常感謝您的幫助,我很高興我不是唯一受這種事情困擾的人。 –