无参数构造函数

Parameterless constructor

我是一个相当有经验的 .net 开发人员,但对 Arduino 和 C/C++ 还是个新手,我正在尝试创建我的第一个库,它是一个用于 7 段 LED 显示屏的简单驱动程序。我有很多迟钝的编译器错误,但本着一次只做一件事的精神,这是第一个。我想向我的 class 添加一个无参数构造函数,当我做库编译时很好,但是当我尝试在草图中使用 class 时,编译器给我相当迟钝的 "request for member 'setDigit' in 'sevenSegmentLed', which is of non-class type '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?

我认为问题在于:

SevenSegmentLed sevenSegmentLed();

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

要修复,您可以做两件事:

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

SevenSegmentLed sevenSegmentLed{};

或使用以下语法:

SevenSegmentLed sevenSegmentLed;

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

SevenSegmentLed sevenSegmentLed{1};

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