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