렌더링 기능을 사용하기 위해 객체를 목록 (또는 벡터)에 동적으로 추가 할 수 있어야하는 DirectX 프로그램을 만듭니다. "[]"연산자를 통해 이러한 객체에 액세스 할 수 있어야하므로 목록 대신 벡터가 사용됩니다. 문제는 push_back을 사용하여 객체를 추가 할 때 객체를 두 번 저장한다는 것입니다. 예를 들어; 벡터가 비어 있고 첫 번째 객체를 추가하면 해당 객체가 색인 0과 색인 1에 저장됩니다.이 객체는 모든 객체를 순환하여 렌더링해야하는 내 렌더링 함수에 문제를 만듭니다. 결과적으로 각 객체가 두 번 렌더링됩니다. CPP에있는 객체를 통해 루프C++ vector.push_back은 한 번 객체를 추가 할 때 객체를 두 번 추가합니다. * 해결 된 내용 *
이bool Level1::LoadContent()//funtion in the Level1 class
{
Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object
SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector
Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object
SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector
Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object
SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector
return true;
}
코드 : CPP 파일에있는 개체를 추가 할 수
class Level1 : public Dx11DemoBase// Define Level1 Class
{
public:
vector<Sprite1> SpriteList2;//Define Vector
};
코드 : 헤더 파일에있는 벡터 (SpriteList2)를 정의
코드 파일 :
void Level1::Render()//funtion in the Level1 class
{
for (Sprite1 sprite : SpriteList2)//Loop through Vector
{
//Code to use the "sprite" object in rendering functions
worldMat = sprite.GetWorldMatrix();//Retrieve values from each sprite object
}
}
참고 개체를 추가하는 코드 (위 그림 참조)는 별도의 cpp 파일에 있으며 벡터는 헤더 파일에 정의되어 있습니다.
동일한 결과를 사용하여 다른 유형 (예 : int)으로 시도했습니다. 벡터가 헤더 파일 외부에서 정의되었지만 벡터가 헤더 파일 내부에서 정의되어 렌더링 기능에서 액세스 할 수 있어야하는 경우에는이 문제가 발생하지 않습니다.
이 코드로 재생산 할 수 없습니다. 문제를 재현하기 위해 컴파일 할 수있는 최소 및 완전한 * 예제를 만드십시오. – cdhowie
"문제는 push_back을 사용하여 객체를 추가 할 때 객체가 두 번 저장된다는 것입니다."- C++ 표준 라이브러리에서이 버그를 발견 한 첫 번째 인물은 무엇입니까? 당신의 _own_ 코드에 버그가있을 가능성을 대비하십시오 :-) – paxdiablo
다른 사람들이 말했듯이, 여러분은 우리에게 보여주지 않는 코드 어딘가에 버그가 있습니다. vector 클래스는 당신이 그것을 삽입 할 때마다 모든 아이템을 두 번 저장하지 않는다. 당신이 생각하는 것보다'push_back()'을 두 번 호출해야한다. 아니면 어딘가에서 프로그램의 메모리 손상이있을 수도 있습니다. –