2013-05-01 1 views
0

조이스틱 입력 (관련 없음)을 처리하는 클래스를 코딩하려고하는데, 상속에 녹슬고 C++에 새로운 것입니다. 조이스틱 클래스의 하위 클래스를 만들 때 혼란을 겪고 있습니다. 그 동작은 약간 다릅니다 여기 여기 내 코드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 클래스와이를 확장하기 위해 노력하고있어. 이를 위해 나는

#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 클래스의 외부 무엇을 확신 아니에요이다 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를 만들었습니다. Java에서 왔기 때문에 수퍼 클래스를 확장하고 모든 메소드와 멤버를 자동으로 사용할 수있었습니다. 저는 C++이 .h와 .cpp 파일들로 분리되어 있기 때문에 혼란 스럽습니다. 내가 주변에서 어지럽 혀서 배운 것을 보면, 비록 그들이 수퍼 클래스의 멤버 일지라도 사용하고자하는 모든 변수와 메소드를 선언해야합니다. 저는 buttonClicked() 메서드를 두 번 정의해야한다고 생각하지 않습니다. 로봇을 가지고 있지 않아도 실제로 테스트 할 수는 없습니다.

기본적으로 JoystickOne 클래스의 정의와 그 작업 방법을 생략 할 수 있습니다. C++의 좋은 OOP 프랙티스에 대해 조언을 구하십시오. 공유하고 싶거나 java-isms를 정리할 수도 있습니다.

감사합니다.

+1

하위 클래스의 수퍼 클래스 멤버를 다시 선언 할 필요는 없습니다. 'protected' 키워드를 사용하여 슈퍼 클래스와 그 자식 사이에 공유하고자하는 모든 멤버를 선언하십시오. 덮어 쓰기를 원하는 메소드는 수퍼 클래스에서'virtual'으로 표시되어야합니다. 그리고 그게 다야. 그 상속과는 별개로 C++과 java에서 꽤 똑같습니다. – Greg0ry

+1

C++에서 상속에 관한 간단한 튜토리얼을 살펴 보는 것이 유용 할 것 같네요 .--) 이건 어때요? : http://www.cplusplus.com/doc/tutorial/classes/ – Greg0ry

+0

'내가 배운 것에서 주위를 어지럽 혀서 내가 사용하고자하는 모든 변수와 메소드를 선언해야한다. 비록 그들이 슈퍼 클래스'Nope의 멤버 일지라도. –

답변

4

기본 클래스에서 virtual으로 재정의 할 수있는 메서드를 표시해야합니다. 파생 클래스에서 재정의하려면 파생 클래스에서 다시 정의하기 만하면됩니다.

예 : 지금 당신은 인스턴스화 경우

class Base{ 
public: 
    virtual void overrideThis() { std::cout << "Base" << std::end; } 
    void test() { std::cout << "Base::test()" << std::endl; } 
}; 

class Derived : public Base{ 
public: 
    void overrideThis() { std::cout << "Derived" << std::endl; } 
}; 

: 멤버 변수에 관해서는

Derived d; 
d.overrideThis(); // Will print 'Derived' 
d.test(); // Will print 'Base::test()' 

. 기본 클래스에서 정의 된 전용 멤버는 파생 클래스에서 사용할 수 없습니다. 반면에 protected 및 public 멤버 변수에 액세스 할 수 있습니다.

+0

당신의 대답은 오해의 소지가 있다고 생각합니다. '가상'으로 표시되지 않은 멤버도 상속됩니다. 'virtual'은 파생 클래스에서 재 정의 될 수있는 멤버를 표시합니다. – psibar

+0

@ psibar, 혼란스럽게 생각합니다. 나는 내 대답을 편집했다. – Ryan

+0

좋아 보이네요 :) – psibar

3

함수를 상속 가능하게 만들려면 virtual 키워드를 사용해야합니다. 또한, 당신은 추상 메소드에 해당 될 것입니다

buttonClicked(int id) = 0;

이 같은 기능을 선언 할 수 있습니다.

변수를 다시 정의 할 필요는 없으며 공개 또는 보호 된 변수가 자동으로 상속되어야합니다. 또한 소멸자를 항상 가상으로 선언해야합니다. 그렇지 않으면 상속 된 클래스가 자신의 물건을 삭제할 수 없게됩니다.

0

아니요 상속 된/자식 클래스의 특성을 다시 선언 할 필요가 없으므로이를 제거하십시오. 일반적으로 비공개 (상위 클래스에서만 사용 가능) 또는 보호 (상위 클래스와 하위 클래스에서 사용 가능)를 공개하지 않습니다. 자신의 메서드를 사용하면 하위 클래스에서 다르게 작동하는 경우에만 (다시 정의) 다시 선언하고 부모 클래스에서 가상으로 선언해야합니다. 실험은 좋습니다 ..몇 가지 물건을 제거하고, 많은 인쇄 문을 추가하고, 어떻게 동작하는지 확인하십시오 :) .h/.cpp와 별개로 Java *와 다른 점이 없습니다.

* 기본 수준

관련 문제