2017-02-15 1 views
3

Chest의 벡터를 저장하는 클래스를 만들려고합니다. Chest은 내가 만든 사용자 정의 클래스입니다. 여기 ItemManager.h의 중요한 부분이다C++ - 벡터의 객체를 수정할 수 없습니다.

class ItemManager 
{ 
public: 
    ... 
    void GenerateItems(sf::Vector2u currentPos); 
    void CheckCollisions(Collider& collider); 
    ... 

private: 
    std::vector<Chest> chests; 
}; 

는 그리고 여기 (관련 부분) ItemManager.cpp이다

void ItemManager::GenerateItems(sf::Vector2u currentPos) 
{ 
    if (rand() % 50 == 0) 
     chests.push_back(Chest(sf::Vector2f(16 * currentPos.x + 1, 16 * currentPos.y - 4 - 2))); 
} 

void ItemManager::CheckCollisions(Collider & collider) 
{ 
    for (Chest chest : chests) 
     if (collider.CheckCollision(chest.getCollider(), 1.0f)) 
      chest.OnInteract(); 
} 

지금 chest.OnInteract()CheckCollisions()에서 호출되는 경우에도 있다는 데 문제 , 가슴에 아무것도 일어나지 않습니다. 그러나 GenerateItems() 메서드에서 chest.OnInteract()을 호출하면 가슴에 예상되는 내용이 적용되므로 메서드에 문제가 없습니다. 내 생각에, 다른 메서드에서 로컬 변수를 만들어서 vector을 추가하기 때문에 추가되는 개체가 범위를 벗어나 더 이상 참조 할 수 없습니다. 그러나 vector에 추가하면 사본이 생성되므로 문제가되지 않는다고 믿는 것이 좋습니다. 어떤 도움을 주셔서 감사합니다.

void Chest::OnInteract() 
{ 
    open = true; 
    chest.setSize(sf::Vector2f(14, 16)); 
    chest.move(sf::Vector2f(0, -2)); 
    chest.setTextureRect(sf::IntRect(14, 0, 14, 16)); 
} 

openchestChest의 멤버 변수입니다

편집
여기 내 OnInteract() 방법이다.

답변

2

루프 다음 ​​OnInteract() 방법은 그 임시 개체에서 호출 할 수 있도록

for (Chest chest : chests) { ... } 

Chest 객체의 임시 복사본을 만들 것입니다. 당신이 대신 원하는 것은과 같이, 객체에 대한 참조입니다 :

for (Chest &chest : chests) { ... } 

있도록 (presumibly OnInteract() 방법에서 일어나고있는) 변경하여 chests 용기 내부의 객체에 적용하고이 아니 임시 복사본된다.

for (auto&& chest : chests) 
    if (collider.CheckCollision(chest.getCollider(), 1.0f)) 
     chest.OnInteract(); 

auto&& 단순히 당신이 원하는 것을 의미한다 : 당신은 대신 객체의 참조를 만들어 문제를 간단하게 해결할 수

//  ,--- Chest is a local variable, not a reference. 
//  v It is constructing with the value of each chest in chests. 
for (Chest chest : chests) 
    if (collider.CheckCollision(chest.getCollider(), 1.0f)) 
     chest.OnInteract(); 

:

+0

좋아, 나는 그 라인을 따라 뭔가있을 것이라고 생각했다. 그러나, 나는 당신이 말한 것을 시도해 보았지만 어떤 차이점도없는 것처럼 보였습니다. 루프 내에서 가슴을 어떻게 참조하는지 편집해야합니까? –

+0

아니요, 나머지는 정상입니다. 'OnInteract()'메소드는 어떻게 생겼습니까? – simpel01

+0

또한'if' 문의 조건이'true'를 반환 할 것입니까? 'If'가 절대 사용되지 않기 때문에 당신의 프로그램이 결코'OnInteract()'메소드를 실행하지 않을 수도 있습니다. – simpel01

0

chest.OnInteract()를 호출하기 전에, 당신은 실제로 당신의 Chest 개체를 복사 유형, 값 카테고리 또는 cv 한정자에 관계없이 참조. 루프를 기반으로하는 범위에서 변수를 만드는 것이 좋습니다.

+0

슬프게도 여전히 같은 문제가 있습니다. 그러나 코드를 살펴보고 해결할 수있는 다른 곳에서도 같은 오류가 발생하는지 확인합니다. –

관련 문제