无参数构造函数

Parameterless constructor

本文关键字:构造函数 参数      更新时间:2023-10-16

我是一个相当有经验的。net开发人员,但新的Arduino和C/c++,我正试图创建我的第一个库,这是一个简单的驱动程序为7段led显示屏。我有很多编译器错误,但本着一次只做一件事的精神,这是第一个。我想添加一个无参数的构造函数到我的类,当我做库编译很好,但当我尝试在草图中使用类编译器给我相当迟钝的"请求成员'setDigit'在'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?

我认为问题在于:

SevenSegmentLed sevenSegmentLed();

被解释为函数声明而不是初始化。请注意,在c#中你不会有这个问题,因为你有new关键字为你消歧,所以这个特殊的问题被避免了。

你可以做两件事:

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

SevenSegmentLed sevenSegmentLed{};

或者使用以下语法:

SevenSegmentLed sevenSegmentLed;

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

SevenSegmentLed sevenSegmentLed{1};

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