0

我一直在使用电容式按钮为 Arduino 编写乒乓球游戏,但我收到“没有匹配函数调用 'CapacitiveSensor::CapacitiveSensor()'”错误。这是我上过的课程的代码错误:

//Input.cpp

#include <CapacitiveSensor.h>
#include "Input.h"
#include "Arduino.h"

Input::Input (byte sPin, byte rPin1, byte rPin2) { //I get the error on this line
    upButton = CapacitiveSensor(sPin, rPin1);
    downButton = CapacitiveSensor(sPin, rPin2);
}
//Continued for bChk

然后这是标题:

//Input.h

#ifndef Input_H
#define Input_H
#include "Arduino.h"
#include <CapacitiveSensor.h>

class Input{
    public:
        const static byte up = 0;
        const static byte down = 1;
        CapacitiveSensor upButton;
        CapacitiveSensor downButton;
        boolean bChk(byte button);
        Input(byte sPin, byte rPin1, byte rPin2);
};

#endif

我知道标准命名约定说常量应该大写,但它们已经被保留了。而且变量等应该是私有的。我很懒。此外,我在与调用构造函数的行不同的行上得到错误......我也没有创建 CapacitiveSensor 类。

我在 Mac 上,如果这很重要(我对此表示怀疑)。

4

2 回答 2

1

看起来CapacitiveSensor该类没有定义默认构造函数,因此Input该类不知道如何构造upButtonand downButton

一个选项是初始化upButtondownButtonInput构造函数中传递所需的参数:

class Input {
public:
    Input(byte sPin, byte rPin1, byte rPin2)
        : upButton(CapacitiveSensor(sPin, rPin1))
        , downButton(CapacitiveSensor(sPin, rPin2))
    {}
    CapacitiveSensor upButton;
    CapacitiveSensor downButton;
};

另一种选择是将这些成员转换为指针,并使用new所需的参数分配它们。例子:

class Input {
public:
    Input() : upButton(NULL), downButton(NULL) {}
    void initializeMembers(byte sPin, byte rPin1, byte rPin2) {
        upButton = new CapacitiveSensor(sPin, rPin1);
        downbutton = new CapacitiveSensor(sPin, rPin2);
    }
    CapacitiveSensor *upButton;
    CapacitiveSensor *downButton;
};

或者最终,您可以扩展CapacitiveSensor类,定义默认构造函数,并将固定参数传递给超级构造函数。我相信这不是你想要的,但无论如何:

class CustomCapacitiveSensor : public CapacitiveSensor {
public:
    CustomCapacitiveSensor() {
        CapacitiveSensor(1, 2);
    }
};
于 2012-12-29T00:33:41.410 回答
1

要使用您显示的代码,CapacitiveSensor 类必须同时具有不带参数的默认构造函数和等于运算符重载(赋值)。这不太可能是您想要的,因为它构造了一个临时对象,然后将其分配回类成员,这很浪费。

要构造成员对象,请使用以下代码:

Input::Input(byte sPin, byte rPin1, byte rPin2) :
  upButton(sPin, rPin1), downButton(sPin, rPin2)
{
...
}

这将直接构造两个对象实例。

于 2012-12-29T07:33:02.203 回答