无参数构造函数

Ben*_*son 3 c++ arduino most-vexing-parse arduino-ide

我是一个非常有经验的.net开发人员,但是对Arduino和C / C ++还是陌生的,我正在尝试创建我的第一个库,该库是7段LED显示屏的简单驱动程序。我有很多钝的编译器错误,但本着一件事的精神,这是第一次。我想在类中添加一个无参数的构造函数,当我进行库编译时很好,但是当我尝试在草图中使用该类时,编译器为我提供了一个相当晦涩的“请求'sevenSegmentLed'中的成员'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:

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将构造函数签名更改为:SevenSegmentLed(int wtf);并实例化它:SevenSegmentLed sevenSegmentLed(1);编译就很好。如参数所示,WTF?

shu*_*e87 7

我认为问题在于:

SevenSegmentLed sevenSegmentLed();
Run Code Online (Sandbox Code Playgroud)

被解释为函数声明而不是初始化。请注意,c#不会出现此问题,因为您为new关键字消除了歧义,因此可以避免此特定问题。

要解决此问题,您可以做两件事:

使用c ++统一初始化语法(在较新的c ++标准中引入,以避免出现确切的问题):

SevenSegmentLed sevenSegmentLed{};
Run Code Online (Sandbox Code Playgroud)

或使用以下语法:

SevenSegmentLed sevenSegmentLed;
Run Code Online (Sandbox Code Playgroud)

统一语法的主要好处是统一。因此,例如,如果您有一个采用整数的构造函数,则可以这样编写:

SevenSegmentLed sevenSegmentLed{1};
Run Code Online (Sandbox Code Playgroud)

一般来说,最好使用统一的初始化语法,当我在工作中编写c ++准则(主要是c#和php专家)时,我决定使用它,因为它是最清晰明确的。