lpd3dxsprite 객체의 벡터를 저장하는 방법은 무엇입니까?
문제
lpd3dxsprite 객체의 벡터를 저장하고 싶다고 가정 해 봅시다. 이 코드를 선언하는 줄은 일 것입니다 std::vector<LPD3DXSPRITE> sprites;
다음과 같이 스프라이트를 만들 수 있어야합니다.
LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);
마지막으로 이것을 벡터에 추가 할 수 있어야합니다.
sprites.push_back(sprite);
적어도 내 이해와 함께, 그것은 그럴듯해야합니다. 그러나 이것은 컴파일하지만 런타임 오류가 제공됩니다. 왜 이런거야? 내가 잘못하고 있는가? 어떻게 고칠 수 있습니까?
편집하다:
이것은 또한 도움이 될 수 있습니다. 통화 스택은이 기능에 대한 생산됩니다 vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38
불리는 것입니다. 이것은 통과 된 벡터가 아닙니다.
그러나 lpd3dxsprite는 id3dxsprite *의 typedef 일뿐입니다. 이것이 무엇이든 빛을 가져올 수 있습니까?
해결책
코드를 살펴본 후 문제를 발견했습니다. 응용 프로그램에서 휴식을 취할 때 볼 내용은 "Autos"탭 또는 현지인 탭입니다. 여기에 당신은 this
포인터 : NULL입니다!
그것은 인스턴스를 의미합니다 AddSprite
호출되는 것은 존재하지 않습니다. 이건 너의 SpriteManager
, 내가 보는 것은 싱글 톤입니다. 당신의 메인에서는 인스턴스를 만들지 않습니다.
나는 그것을 작동시키기 위해 몇 가지 일을해야했다. 나는 포함했다 "LudoRenderer/SpriteManager.h"
안에 Main.cpp
, 그리고 추가 CreateInstance
전화:
SpriteManager::CreateInstance();
이것의 유일한 문제는 당신이 다른 싱글 톤과 마찬가지로 당신의 생성자/소멸자 개인을 선언했지만 결코 정의하지 않았다는 것입니다.
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){}
이러한 변경 후에는 "작동했습니다". 문제가 해결 되었기 때문에 인용문이지만 코드의 뒷부분에 또 다른 오류가 있습니다. m_GameManager->SetWagon(m_Wagon);
.
여기, m_GameManager
초기화되지 않았습니다. 나는 무책임합니다 m_GameManager = GameManager::GetInstance();
43 라인에 LudoEngine.cpp
, 우리를 이전과 같은 문제에 넣었는데, CreateInstance
항상 호출됩니다. Main에 필요한 헤더를 만들었습니다. 이것은 문제가 해결되었고 엔진이 실행되었습니다 (멋진 데모도!)
출구에 충돌이 발생했습니다 ErrorLogger::LogError
, 왜냐하면 ErrorLogger
null이었다. 그것은 호출되었습니다 LudoMemory
의 파괴자이지만 이거 맡길 게요. :)
이제 도움이 될 두 가지 팁입니다. 첫 번째는 우리가 해결하는 문제에 관한 것입니다. 일반적으로 싱글 톤은 아직 없다면 스스로를 만들 것입니다. 나는 당신의 싱글 톤을 바꿀 것입니다 GetInstance
다음과 같은 것 :
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
}
return m_Singleton; // not sure what the cast was for
}
이로 인해 싱글 톤이 아직 없었다면 싱글 톤의 창조를 강요 할 것입니다. 이제 사용자에게 전화를 원한다면 CreateInstance
시도하기 전에 GetInstance
, 당신은 일종의 경고를 추가 할 수 있습니다.
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
std::cerr << "Warning, late creation of singleton!" << std::endl;
// or perhaps:
ErrorLogger::GetInstance()->
LogError(L"Warning, late creation of singleton!");
}
return m_Singleton;
}
그것은 "어떤 싱글 톤?"중요한 정보를 제거하기 때문에 항상 typeinfo를 추가하려고 시도 할 수 있습니다.
#include <typeinfo>
// ...
std::cerr << "Warning, late creation of singleton: "
<< typeid(T).name() << std::endl;
거기에 유형 이름을 얻으려고 노력합니다.
그리고 마지막으로, 괜찮습니다 delete 0
, 확인 된 삭제 매크로가 필요하지 않습니다.
명확히하기 위해, 당신은 가지고 있습니다 LUDO_SAFE_DELETE
, 삭제 호출하기 전에 널이 아닌지 확인합니다. C ++에서는 NULL 삭제에 영향을 미치지 않으므로 수표가 필요하지 않습니다. 안전 삭제의 모든 인스턴스는 Ludo_delete로만 대체 될 수 있습니다.
다른 팁
코드는 나에게 괜찮아 보인다. 그러나 벡터에 ID3DXSprite에 대한 포인터를 저장하고 있습니다. 이것은 어떻게 할당되지 않습니까? 벡터가 유효하지 않은 포인터를 잡고 포인터를 참조하려고 시도하여 스프라이트가 분리 될 가능성이 있습니까?