2015-07-19 217 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

非常感谢您的帮助,我很高兴我不是唯一受这种事情困扰的人。 –