게임에 대해 다양한 유형의 자산을로드하고 유지 관리하는 ContentManager
클래스를 작성하려고합니다 (XNA's ContentManager과 비교). 내 헤더 파일처럼 보이는 다음C++ : 복사 작업이 불합리하거나 불가능한 리소스를 저장하는 중
class ContentManager
{
public:
ContentManager(Direct3D& d3d, const std::string& rootDirectory = "Resource");
~ContentManager();
template<typename T>
const T& Load(const std::string& assetName);
private:
Direct3D& d3d_;
std::string rootDirectory_;
std::map<std::string, Texture> textures_;
};
당신이 볼 수 있듯이, 나는 각 자산에 대한 명시 적 인스턴스화 일반적인 Load<T>()
방법 (단지 순간에 텍스처) 각 자산 유형에 대한지도가 유형을 저장하고 싶습니다. Load<Texture>()
은 디스크에서 이미지 파일을 읽습니다 (아직 맵에없는 경우). Texture
을 새로 작성하여 맵에 삽입하고 리턴합니다.
내 Texture
클래스는 기본적으로 생성하고 RAII
관용구를 따라 원시 IDirect3DTexture9
을 캡슐화 (소멸자가 texture_
에 Release()
를 호출) : 내 코드를 테스트 할 때
class Texture
{
public:
Texture();
Texture(Direct3D& d3d, unsigned int width, unsigned int height,
const std::vector<unsigned char>& stream);
~Texture();
IDirect3DTexture9* GetD3DTexture() const { return texture_; }
private:
IDirect3DTexture9* texture_;
};
, 나는, 각 텍스처 두 번 출시 된 것을 깨달았 Texture
개체의 (얕은) 복사본이 어느 시점에서 생성 되었기 때문에 소멸자가 이들 각각에 대해 호출 되었기 때문에.
더 나아가 Load<T>()
은지도의 요소에 대한 참조를 반환하지만 발신자는 직접 사본을 만들어 동일한 문제를 유발할 수 있습니다. 내 생각 : 맵에 새 요소를 삽입 할 std::pair
를 생성 할 때 복사가 어쨌든 필요하기 때문에 Texture
개인의 복사 생성자를 만들기
이 해결책입니다.
딥 복사본을 만드는 사용자 지정 복사본 생성자를 정의하는 것은 실제로는 한 번만 있어야하는 기본 Direct3D 텍스처 복사본을 만들어야하므로 전혀 적합하지 않은 것처럼 보입니다.
여기 내 옵션에는 어떤 것이 있습니까? 이것은 스마트 포인터를 사용하여 해결할 수 있습니까? 어떤 유형이지도에 저장되어야하며 어떤 유형이 Load<T>()
으로 반환되어야합니까?
직무를 찾은 다음 과제를 옮깁니다. –