我一直在使用电容式按钮为Arduino编写一个Pong游戏,而且我一直在调用“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上,如果重要的话(我对此表示怀疑)。
答案 0 :(得分:1)
看起来CapacitiveSensor
类没有定义默认构造函数,因此Input
类不知道如何构造upButton
和downButton
。
一个选项是在upButton
构造函数中初始化downButton
和Input
,传递必需的参数:
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);
}
};
答案 1 :(得分:1)
要使用您显示的代码,CapacitiveSensor类必须同时具有不带参数的默认构造函数和等于运算符的重载(赋值)。这不太可能是你想要的,因为它构造一个临时对象是浪费的,然后将它分配给类成员。
要构建成员对象,请使用以下代码:
Input::Input(byte sPin, byte rPin1, byte rPin2) :
upButton(sPin, rPin1), downButton(sPin, rPin2)
{
...
}
这将直接构造两个对象实例。