2012-11-09 4 views
5

꽤 큰 코드이므로 약간의 코드를 생략 할 것입니다. 제 질문은 std :: make_shared의 작동과 관련이 있습니다. 내가 D3D11Shader라는 네임 스페이스 SYNC에 개체가 있습니다. 이 문자열의 인덱스를 가지고 SYNC에서 파생 된 쉐이더 :: D3D11Shader의 인스턴스에 대한 포인터를 반환합니다라는 정적 기능,std :: make_shared 추상 클래스 인스턴스화를 사용하는 중 오류가 발생했습니다.

SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s) 

있습니다. 한 시점에서 나는 이러한 모든 쉐이더를 가지고있는 벡터 내에서 이들의 할당 해제를 자동화하기 위해 스마트 포인터를 사용하기 시작했습니다. 내가 이렇게 갈 때,

std::shared_ptr<SYNC::D3D11Shader> shaderPtr; 
// ... verification of index and other initialization happens here 
// so i am unable to initialize it in it's constructor 
shaderPtr = std::make_shared<SYNC::D3D11Shader>(SYNC::D3D11Shader::CreateShader(shaderName)); 

컴파일러 오류

내가 추상 클래스입니다이 줄 D3D11Shader의 인스턴스를 실체화하기 위해 노력하고 있다는 말. 나는 모든 make_shared가 std :: shared_ptr의 인스턴스를 리턴했다고 생각했다. CreateInstance 함수는이 클래스의 인스턴스를 생성하려고 시도하지 않으며,이 클래스를 파생하고 구현하는 개체 만 만듭니다. 이 함수와 스마트 포인터를 사용하기 전에이 오류가 발생하지 않았습니다. 아무도 여기서 무슨 일이 일어나는 지 알아? 충분히

+2

make_shared http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared 또는 http://msdn.microsoft.com/en-us/library/ee410595.aspx –

+0

의 문서를 확인하십시오. 정의의 핵심 문구가 "개체를 만듭니다." 어쨌든 단순히 초기화 후 shared_ptr을 포인터로 설정하는 것입니까? – FatalCatharsis

+0

기존에 shared_ptr의 생성자가 있다면 shared_ptr의 생성자를'shared_ptr ptr (your_pointer_here); 또는'ptr.reset (your_pointer_here);를 직접 사용하십시오. –

답변

10

는 그 reset member function 것은 그것에게 새로운 개체의 소유권을 부여하는 데 사용 : 그것은 새로운 T을 구성하기 때문 make_shared<T>이 상황에 적합하지 않은

std::shared_ptr<SYNC::D3D11Shader> shaderPtr; 
shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName)); 

입니다 인수를 생성자에 전달합니다. 이미 객체를 만들었으므로 공유 포인터에 소유권을주고 싶습니다.

CreateShader에서 원시 포인터를 반환하지 않는 것이 좋습니다. CreateShader의 발신자에게 전화를 걸어 스마트 포인터로 포장하거나 delete으로 전화하십시오. unique_ptr을 직접 돌려 주면 클라이언트에게 소유권을 넘겨주는 것이 나을 것입니다. 그러면 원하는 경우 shared_ptr을 만들 수 있습니다. 다음을 참조하십시오 : 단순히

std::unique_ptr<SYNC::D3D11Shader> uniquePtr(SYNC::D3D11Shader::CreateShader(shaderName)); 
// If you want a shared_ptr: 
std::shared_ptr<SYNC::D3D11Shader> sharedPtr(std::move(uniquePtr)); 

또는를 :

std::shared_ptr<SYNC::D3D11Shader> sharedPtr = SYNC::D3D11Shader::CreateShader(shaderName); 

당신이 그들을 사용, 스마트 포인터를 사용하려고하는 경우. :)

+0

명확하고 간결한, 감사합니다 뭉치! – FatalCatharsis

+0

@FatalCatharsis 디자인 변경 방법에 대한 의견을 추가했습니다. –

+0

+1 내 엉덩이를 저장했습니다! –

2

쉬운 :

shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName)); 

당신은 reset 멤버 함수 here의 다른 변종을 볼 수 있습니다. 당신이 shared_ptr의 생성자를 사용할 수없는 경우

관련 문제