无参数构造函数

时间:2015-07-19 00:18:57

标签: c++ arduino arduino-ide most-vexing-parse

我是一位经验丰富的.net开发人员,但他是Arduino和C / C ++的新手,我正在尝试创建我的第一个库,它是7段LED显示屏的简单驱动程序。我有许多迟钝的编译器错误,但一次只有一件事,这是第一个。我想在我的类中添加一个无参数构造函数,当我编译库时很好但是当我尝试在草图中使用该类时,编译器给了我一个相当迟钝的请求成员' setDigit' in' sevenSegmentLed',这是非类型' 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?

1 个答案:

答案 0 :(得分:4)

我认为问题在于:

SevenSegmentLed sevenSegmentLed();

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

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

使用c ++统一初始化语法(在较新的c ++标准中引入以完全避免您的问题):

SevenSegmentLed sevenSegmentLed{};

或使用以下语法:

SevenSegmentLed sevenSegmentLed;

统一语法的主要好处是它是统一的。因此,例如,如果你有一个带整数的构造函数,你可以这样写:

SevenSegmentLed sevenSegmentLed{1};

一般来说,统一初始化语法是可取的,当我在我的工作中编写c ++指南(主要是c#和php人)时,我决定使用它,因为它是最明确和最明确的。