2011-10-29 4 views
1

C++에서 Object 클래스를 사용하여 다른 클래스의 클래스 (예 : Ball, Paddle, Wall)를 상속받습니다. 각 하위 클래스별로 별도의 정적 멤버로 상속되는 Object 클래스에 정적 멤버를 갖는 방법이 있습니까?정적 멤버를 별도로 상속 할 수 있습니까?

기본적으로 Ball, Paddle 및 Wall에 각각 (개체를 상속하는 배열이 모든 개체의 일반적인 요구 사항이기 때문에) Object에서 상속 한 정적 멤버 (그리기 이미지 저장 용)가 있어야합니다. 고정 부재는 볼, 패들 및 벽 각각에 대해 분리되어 있습니다. 그렇게하면 모든 볼 인스턴스가 볼 이미지에 액세스 할 수 있고 모든 패들은 패들 이미지에 액세스 할 수 있습니다.

이것이 가능하지 않은 경우 비슷한 기능을 허용하는 좋은 방법은 무엇입니까?

편집 :

실제로 달성하기 위해 노력하고있어 일부 자세히 : 나는 브레이크 아웃 클론에서 일하고 있어요

. 나는 모든 게임 객체 (Ball, Paddle, Block, Wall)를 상속받는 Object 클래스를 가지고 있습니다. 이러한 모든 객체에는 자신을 그리기 위해 액세스해야하는 이미지가 몇 개 있습니다 (Object *가 std :: list의 모든 객체에 대해 수행하고 모든 객체에서 updateAndDraw() 메소드를 실행 함).

지금 당장 Ball, Paddle, Block 및 Wall 각각에는 객체에 필요한 모든 이미지를 저장하는 SFML (정적 sf :: Texture) 배열이 있습니다. 각 클래스의 모든 인스턴스가 이미지를 공유 할 수 있고 인스턴스마다 별도로로드해야하기 때문에 메모리가 낭비됩니다. 이미지는 각 게임 객체가 처음 구성 될 때로드되고 어레이에 저장됩니다.

기본적으로 이미지로드 및 저장 기능은 모든 게임 개체에서 동일하므로 개별 게임 개체와 개체로 이동하고 싶습니다. 내 계획은 각 게임 개체가 상속받을 Object에 정적 멤버를 갖는 것이 었습니다. 정적 멤버는 Ball, Paddle, Block 및 Wall 각각에 대해 독립적입니다. 나는 또한 loadImages(string filenames[])이라는 객체에 정적 메서드를 가지고 있는데, 이미지 파일의 배열을 가져 와서 loadImages()이 호출 된 게임 객체의 정적 이미지 배열에 이미지를로드합니다. 따라서 Ball 생성자에서 loadImages()을 실행하고 일부 파일 이름을 전달하면 이미지를 Ball의 정적 이미지 배열에로드하고 다른 모든 게임 개체에 대해 (독립적으로)로드합니다.

이 모든 내용을 입력하면 이미지를 다른 위치에 저장하고 게임 개체에 해당 이미지의 포인터를 제공하는 것이 더 낫다는 것을 알고 있습니다. 이것은 이미지 배열을 정적으로 할 필요가 없으며 생성자에서 이미지를 저장하고 객체 유형을 전달하는 함수를 호출 할 수 있으며 게임에 대한 포인터의 배열을 건네줍니다 객체가 필요합니다.

+0

참조 http://stackoverflow.com/questions/594730/overriding-static-variables-when-subclassing – James

+0

이미지를 제공하기 위해 별도의 정적이 아닌 클래스를 만들고이를 구성하는 동안 각 클래스에 이미지를 제공합니다. 그런 다음 각 이미지 저장소 클래스의 단일 인스턴스를 작성하고 작성시이를 각각의 새 오브젝트 클래스로 전달하십시오. 기본적으로, 나는'정적'을 완전히 피하는 것이 리팩토링 프로그램을 훨씬 더 어렵게 만들고 자동화 된 테스트를 작성하는 것을 훨씬 어렵게 만듭니다. –

답변

3

아니요. 그러나 각 하위 클래스에서 정적 변수를 다시 선언 할 수 있습니다.

class A 
{ 
public: 
    static int MyStatic; 
}; 

class B : public A 
{ 
public: 
    static int MyStatic; 
} 

class C : public A 
{ 
public: 
} 

A :: MyStatic은 C :: MyStatic과 동일하지만 B :: MyStatic은 다릅니다. 나는 왜 이런 식으로해야하는지 이해하지 못합니다.

그러나 템플릿을 사용할 수도 있습니다.

template <typename T> 
struct MyStaticContainer 
{ 
    static int MyStaticValue; 
} 

template <typename T> 
int MyStaticContainer<T>::MyStaticValue = 0; 

그런 다음 이런 방식으로 필드를 액세스 할 수 있습니다 이러한 3 개 가지 정적 필드는 실제로

MyStaticContainer<A>::MyStaticValue = 10; 
MyStaticContainer<B>::MyStaticValue = 20; 
MyStaticContainer<C>::MyStaticValue = 30; 

있습니다. 아마 가장 쉬운

1

는 비 정적 멤버로이 모든 것을 가지고있다. "getimages()"(또는 무엇이든간에)라는 가상 함수를 사용하여 기본 클래스가 파생 클래스 세부 정보를 알지 않고도 클래스 특정 이미지에 액세스 할 수 있도록하는 것이 좋습니다.

는 클래스 디자인과 무엇을 이러한 방법과 회원이 내가 최종 추천을하기 전에 어떻게해야하는 대한 자세한 내용을 알고 도움이 될 것이다. 살바토레 (Salvatore)의 템플릿 사용 제안도 적절할 수 있지만 템플릿은 상속 또는 델리게이트 모델로 충분할 경우 종종 남용됩니다.

관련 문제