2012-05-04 6 views
4

배경 정보 : 나와 2 명의 친구가 C++에서이 플랫폼 게임을 도움을 주며 och sfml 및 box2d로 학교 과제를 작성합니다. 요구 사항 중 하나는 "MVC 패턴"을 따르는 것입니다.C++ 벡터가 추상 클래스를 반복합니다.

모델에 Bullet 및 Character와 같은 클래스를 생성했습니다. 그리고 BulletView와 CharacterView (둘 다 추상 클래스 인 sf :: Drawable을 상속받습니다). 이

void WorldView::drawBullets() 
{ 
    std::vector<BulletView*>::iterator it; 
    for (it = bullets.begin() ; it < bullets.end(); it++) 
     window->draw(**it); 
} 

void WorldView::drawCharacters() 
{ 
    std::vector<CharacterView*>::iterator it; 
    for (it = characters.begin() ; it < characters.end(); it++) 
     window->draw(*it); 
} 

같은

대신 도면에 대한 코드를 복제의

그리고이 두 가지 방법의 drawBullets 및 drawCharacter 나는 다음과 같이 보일 것이다 polymorhism를 사용하여보다 일반적인 방법을 싶습니다

void WorldView::drawVector(const std::vector<sf::Drawable*>& vector) 
{ 
    std::vector<sf::Drawable*>::iterator it; 
    for (it = vector.begin() ; it < vector.end(); it++) 
     window->draw(**it); 
} 

bulletView 벡터는 다음과 같이 선언됩니다.

std::vector<BulletView*> bullets; 

Can 그래도이게 작동하지 않아. 그리고 나는 C++에 익숙하지 않으므로 자비를 베풀어주십시오! 나는 검색을 시도했지만 매우 구체적인 답변을 찾지 못했습니다.

오류 컴파일하는 동안 오류가 발생합니다.

오류 8 오류 C2679 : 이진 '='없음 연산자> 유형 오퍼랜드 우측 걸린다 발견 'Vector_const_iterator을 표준 : _을 < _Myvec>'(또는 존재 용인> 변환) C : \되지 사용자 \ niklas \ multiplaya \ sfml 테스트 \ sfml 테스트 \ view \ worldview.cpp 409> 1 SFML_Test

오류 7 오류 C2664 : 'mp :: WorldView :: drawVector': 매개 변수 1을 변환 할 수 없습니다 'std :: 벡터 < _Ty> CONST STD '에서': 벡터 < _Ty> & '에 C : \ 사용자 \ 니클 \ multiplaya \ sfml> 시험 \ sfml 테스트 \ 뷰 \의 worldview.cpp 402 1 SFML_Test

,536,
+0

'std :: vector bullets;'는 유효한 선언이 아닙니다. 벡터의 템플릿 유형은 무엇입니까? – James

+0

@Autopulated 그것은 형식 문제였습니다. – juanchopanza

답변

5

문제는 polimorphism가 작동하지 않는다는 것입니다! 벡터의 레벨은 포함하지만 포인터에 포함 된 레벨의 레벨에 있습니다. 따라서 std::vector<Derived*>은 전혀 다른 유형이므로 std::vector<Base*>으로 전달 될 수 없습니다. 그러나 Derived*에 대한 포인터를 사용하여 std::vector<Base*>을 채울 수 있습니다.

그래서, 당신은

std::vector<Drawable*> bullets; 

로 총알 벡터를 선언해야하고, 예를 들어, BulletView*으로 채우기 :

bullets.push_back(new BulletView(some args)); 

drawVector(bullets); 

: 코드에서 내가 문제를 피하는하고 위 동적으로 할당 된 객체 소유권.분명히 BulletViews을 삭제할 수있는 메커니즘이 있어야합니다.

+0

Hmm okey. 아마도 sf :: Drawable 클래스를 "GameObjectView"클래스와 같은 것으로 서브 클래 싱하는 것으로 끝날 것입니다. 답변 해주셔서 감사합니다! –

1

Composite Design-Pattern을 모방합니다. 당신의 오류는 그러나

: 당신은 에 의해 <를 교체 작성해야 =를 그것이 반복자 아닌 INT

때문에
void WorldView::drawBullets() 
{ 
    std::vector<BulletView*>::iterator it; 
    for (it = bullets.begin() ; it != bullets.end(); it++) 
     window->draw(**it); 
} 

void WorldView::drawCharacters() 
{ 
    std::vector<CharacterView*>::iterator it; 
    for (it = characters.begin() ; it != characters.end(); it++) 
     window->draw(*it); 
} 
I would like a more generic method using polymorhism which would look something like this: 

void WorldView::drawVector(const std::vector<sf::Drawable*>& vector) 
{ 
    std::vector<sf::Drawable*>::iterator it; 
    for (it = vector.begin() ; it != vector.end(); it++) 
     window->draw(**it); 
} 
+0

벡터는'operator < '와 비교할 수있는 랜덤 억세스 반복자를 가지고 있습니다 –

2

for 루프의 it = vector.begin(); 지정에서 오류가 발생합니다. 문제는 iterator (it)을 const iterator (vector.begin()) 번으로 지정하려고한다는 것입니다. const 반복자를 사용하여 데이터 구조를 반복 할 수 없습니다. 각 반복마다 값이 변경되기 때문입니다. 또한 반복자를 사용하여 데이터 구조를 탐색 할 때는 operator < 대신 operator !=을 사용해야합니다.

constconst std::vector& vector에서 제거하면 정상적으로 작동합니다.

희망이 도움이됩니다. 대신 다형성 벡터, 사용 템플릿 기능 사용

+0

감사! 문제는 @juanchopanza가 전에 말한 것으로 보인다. –

3

: 그런데

template <typename T> 
void WorldView::drawVector(const std::vector<T*>& vector) 
{ 
    typename std::vector<T*>::iterator it; 
    for (it = vector.begin() ; it < vector.end(); it++) 
     window->draw(**it); 
} 

- 원시 포인터의 벡터는 나에게 의심스러운. 누가 그것을 소유하고 누가 생성합니까? 누가 삭제할 책임이 있습니까? 값의 벡터 사용을 고려하십시오. boost::ptr_vector

관련 문제