无参数构造函数
Parameterless constructor
我是一个相当有经验的。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的人),我决定使用这个,因为它是最清晰和明确的。
相关文章:
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在按值调用 (c++) 中转发构造函数参数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 如何在构造函数参数中初始化"std::set"?
- 何时应在构造函数参数中使用 const C++?
- 使用模板化结构作为构造函数参数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 如何使输入文本文件成为构造函数参数?c++
- shared_ptr构造函数参数是否应按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 复制构造函数参数为0
- 用作成员构造函数参数的函数的求值顺序
- 结构中的默认成员值或默认构造函数参数
- C++将引用成员绑定到构造函数参数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 模板函数指针参数与构造函数参数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何基于构造函数参数模板化类成员函数的代码
- 将派生类构造函数参数传递给受保护的成员
- 如何根据构造函数参数使用超类类型初始化成员变量?