无参数构造函数
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 人员)我决定采用它,因为它是最清晰和明确的。
我是一个相当有经验的 .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 人员)我决定采用它,因为它是最清晰和明确的。