5

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

4

1 回答 1

9

我认为问题在于:

SevenSegmentLed sevenSegmentLed();

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

要修复,您可以做两件事:

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

SevenSegmentLed sevenSegmentLed{};

或使用以下语法:

SevenSegmentLed sevenSegmentLed;

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

SevenSegmentLed sevenSegmentLed{1};

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

于 2015-07-19T00:25:35.417 回答