2012-04-05 4 views
2

리소스 로더를 만들려고하고 클래스 리소스와 템플릿 클래스 리소스 관리자를 갖고 싶습니다. 다른 유형의 리소스는 기본 리소스 클래스 (예 : 이미지, 3D 메시 등)에서 상속받습니다.기본 클래스와 그 파생 클래스로 제한된 C++ 템플릿

모든 유형의 리소스에 대한 맵을 가질 수는 있지만 파생 클래스 고유의 함수를 호출 할 수 없습니다. 3dMesh에는 이미지로 getWidth() 등이있을 수있는 getVertecies()가있을 수 있습니다.

그래서 템플릿이있는 resourceManager 클래스를 사용할 것입니다. 자원 관리자는 자원 유형이 아닌 기본 리소스 클래스의 포인터를 반환

resourceManager<3dMesh> resMan3DMeshes(); 
resourceManager<picture> resManPictures(); 

:

그럼 당신은 같은 자원 관리자를 만들 수 있습니다. 그렇게하면 각 리소스 유형에 맞는 함수를 호출 할 수 있습니다.

pointerToMesh->getVerticies(); 
pointerToPicture->getWidth(); 

그러나이 방법을 사용하면 리소스 관리자를 만드는 데 아무 것도 통과 할 수 없습니다.

resourceManager<int> resManInts(); 

리소스 관리자가 기본 리소스 클래스의 기능을 호출 할 수 있어야한다는 점을 제외하고는 문제가 없습니다. 예를 들어 기본 리소스 클래스는 파일에서로드하기위한 가상 함수를 갖지만 리소스 관리자는 템플릿으로 아무것도 전달할 수 없으므로 이러한 함수를 호출 할 수 없으며 int 또는 string 또는 loadFromFile ().

기본 클래스를 사용하여 템플릿을 사용하여 작업을 수행하려고했으나 모든 파생 클래스를 전문으로하지 않는 한 기본 클래스의 포인터와 파생 클래스가 아닌 포인터를 반환합니다. 템플릿이없는 클래스가 아니라 각 유형에 대한 리소스 관리자 클래스 만 있으면됩니다.

템플릿을 사용하고 파생 클래스의 함수를 호출하는 장점이 있지만 기본 클래스의 함수에 여전히 익숙하지 않은 방법이 있습니까?

+0

템플릿이 클래스 멤버를 호출하면 해당 멤버가없는 유형에 템플릿을 인스턴스화 할 수 없습니다. 컴파일되지 않습니다. – sje397

+0

질문을 파싱하는데 문제가 있습니다. 아마도 문제가되는 도메인 언어 중 일부를 배제 할 수 있습니까? –

답변

1

템플릿에이 메서드를 사용하는 것보다 모든 유형에 "loadFromFile()"메서드가 있어야합니다. 누군가가 "int"를 템플릿 인수로 제공하면 컴파일되지 않을 것입니다. 이해할 수있는 한,이 누군가는 그렇게하지 않아도됩니다.

제공되는 모든 유형 (예 : "loadFromFile() 메소드 사용")이 필요한 인터페이스를 문서화하십시오.

+0

그래,이게 가장 간단한 해결책 인 것 같아. 고맙습니다 :) 리소스 관리자가 호출 할 모든 기능을 구현하는 가상 기본 클래스 리소스가있는 경우 모든 파생 클래스가 가상 함수를 덮어 썼는지 확인한 다음 해당 파생 클래스를 컴파일 오류가없는 자원 관리자. – jtedit

+0

@jtedit 컴파일 타임에 모든 것이 알려지면 가상 메소드가있는 기본 클래스가 필요하지 않습니다. 가상 메소드가 필요한 곳에서 사용하십시오 (현재 또는 향후 개선 예정). – selalerer

1

예, 템플릿 매개 변수를 특정 클래스의 자손으로 제한 할 수 있습니다. see this answer.

아니면 그대로 둘 수 있습니다. 리소스 관리자는 필요한 인터페이스를 만족하지 않는 템플릿 매개 변수로 컴파일되지 않습니다.

관련 문제