0

ジョイスティック入力を処理するクラスをコーディングしようとしています (関係ありません)。継承が錆びていて、c++ が初めてなので、ジョイスティック クラスのサブクラスを作成しようとしているときに混乱しています。これが私のコードです

//superclass's .h
#ifndef JOYSTICKINPUT_H
#define JOYSTICKINPUT_H

#include "WPILib.h"

class JoystickInput {
    public:
        JoystickInput(Joystick*);
        Joystick * joystick;
        Victor * myVictor [3];
        bool buttons [10];
        bool buttonClicked(int id);
        void testForActions();
};
#endif

そして、ここにその定義があります

//superclass's .cpp
#include "JoystickInput.h"

JoystickInput::JoystickInput(Joystick * joy) {
    joystick = joy;
    for (int x = 0; x < 10; x++) {
        buttons[x] = false;
    }
}

bool JoystickInput::buttonClicked(int id) {
    if (buttons[id] == false and joystick->GetRawButton(id) == true) {
        buttons[id] = true;
        return true;
    } else if (buttons[id] == true and joystick->GetRawButton(id) == false) {
        buttons[id] = false;
        return false;
    } else {
        return false;
    }
}

void JoystickInput::testForActions() {
}

動作が少し異なるため、JoystickOne クラスでこれを拡張しようとしています。この目的のために、JoystickOne.h と JoystickOne.cpp を作成しました。

//Joystickone.h
#ifndef JOYSTICKONE_H
#define JOYSTICKONE_H
#include "WPILib.h"
#include "JoystickInput.h"

class JoystickOne : public JoystickInput {
    public:
        JoystickOne(Joystick*);
        Joystick * joystick;
        Victor * myVictor;
        bool buttons [10];
        bool buttonClicked(int id);
        void testForActions();
};
#endif

そして.cpp

    #include "JoystickOne.h"
#include "WPILib.h"

JoystickOne::JoystickOne(Joystick * joy) : JoystickInput(joy) {
    //joystick = joy;
    //myVictor = new Victor(1);
    /*for (int x = 0; x < 10; x++) {
        buttons[x] = false;
    }*/
}

bool JoystickOne::buttonClicked(int id) {
    if (buttons[id] == false and joystick->GetRawButton(id) == true) {
        buttons[id] = true;
        return true;
    } else if (buttons[id] == true and joystick->GetRawButton(id) == false) {
        buttons[id] = false;
        return false;
    } else {
        return false;
    }
}

void JoystickOne::testForActions() {
    if (buttonClicked(1)) {
    }
    if (buttonClicked(2)) {
    }
    if (buttonClicked(3)) {
        //myVictor->Set(.3);
    }
    if (buttonClicked(4)) {
    }
}

私の問題は、JoystickOne クラスの何が異質なのかよくわからないことです。私は Java 出身なので、スーパークラスを拡張するだけで、そのすべてのメソッドとメンバーを自動的に使用できることに慣れています。C++ が .h ファイルと .cpp ファイルに分かれているため、私は混乱しています。いじって学んだことから、スーパークラスのメンバーであっても、使用したいすべての変数とメソッドを宣言する必要があります。メソッド buttonClicked() を 2 回定義する必要はないと思いますが、ロボットを持っていないため、実際にテストすることはできません。

基本的には、JoystickOne クラスの定義から切り出せるものと、その方法を尋ねています。C++ での優れた OOP プラクティスについてアドバイスをお持ちの方がいらっしゃいましたら、お気軽に共有してください。または、私が持っている Java 主義を解消することもできます。

ありがとう!

4

3 に答える 3

3

virtual関数を継承可能にするには、キーワードを使用する必要があります。さらに、次のような関数を宣言できます。

buttonClicked(int id) = 0;

これは、抽象メソッドに相当します。

変数を再定義する必要はありません。パブリックまたはプロテクトの場合、変数は自動的に継承されます。また、デストラクタを常に仮想として宣言する必要があることにも注意してください。そうしないと、継承されたクラスが独自のものを削除できなくなります。

于 2013-05-01T20:49:43.510 に答える