c++ - 无参数构造函数

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

我是一名相当有经验的 .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:

}

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

最佳答案

我认为问题在于:

SevenSegmentLed sevenSegmentLed();

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

要修复你可以做两件事:

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

SevenSegmentLed sevenSegmentLed{};

或者使用如下语法:

SevenSegmentLed sevenSegmentLed;

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

SevenSegmentLed sevenSegmentLed{1};

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

关于c++ - 无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31496810/

相关文章:

c++ - Arduino 未定义对“运算符”的引用

c++ - 为什么渲染的方 block 重复?

c++ - 为什么c++中的main()函数不用调用,反正运行了?

c++ - Arduino ESP32 如何将 BLEUUID 对象分配给字符串

c++ - 如何使用 C++ 在 Arduino 上制作 LED 闪光灯,但除了 millis() 之外不使用任何函数

c++ - 串行监视器显示来自 Arduino Mega 的意外输入

c++ - Serial.read() 跳过串行输入

C++ - 将 int 拆分为两个较小的数据类型

c++ - 按时间管理许可证

c - Arduino代码编译错误: "lvalue required as left operand of assignment"