0

容量性ボタンを使用してArduino用のPongゲームを作成していて、「'CapacitiveSensor :: CapacitySensor()'の呼び出しに一致する関数がありません」というエラーが発生しました。これまでのクラスのコードは次のとおりです。エラー:

//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クラスはデフォルトのコンストラクターを定義していないように見えるため、クラスはandのInput構築方法を知りません。upButtondownButton

オプションは、初期化upButtondownButtonInputコンストラクターで必要な引数を渡すことです。

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

もう1つのオプションは、これらのメンバーをポインターに変換し、を使用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クラスに、パラメーターを受け取らないデフォルトのコンストラクターと、equals演算子のオーバーロード(代入)の両方が必要です。一時オブジェクトを作成し、それをクラスメンバーに割り当てるので無駄なので、これはあなたが望むものではありません。

メンバーオブジェクトを作成するには、次のコードを使用します。

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

これにより、2つのオブジェクトインスタンスが直接構築されます。

于 2012-12-29T07:33:02.203 に答える