背景资料: 我和几个 friend 在 och sfml 和 box2d 的帮助下用 C++ 构建这个平台游戏用于学校作业。 其中一项要求是我们遵循“MVC 模式”。
我们为模型创建了 Bullet 和 Character 类。以及 BulletView 和 CharacterView(都继承了抽象类 sf::Drawable)作为 View 。
与其重复绘图代码,不如像这样使用 drawBullets 和 drawCharacter 两种方法
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);
}
我想要一个使用多态性的更通用的方法,它看起来像这样:
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 vector 声明如下:
std::vector<BulletView*> bullets;
虽然不能让它工作。我是 C++ 的新手,所以请怜悯!我试过搜索,但没有找到非常具体的答案。
我在编译时遇到的错误。
Error 8 error C2679: binary '=' : no operator found which takes a right-hand >operand of type 'std::_Vector_const_iterator<_Myvec>' (or there is no acceptable >conversion) c:\users\niklas\multiplaya\sfml test\sfml test\view\worldview.cpp 409 >1 SFML_Test
Error 7 error C2664: 'mp::WorldView::drawVector' : cannot convert parameter 1 from >'std::vector<_Ty>' to 'const std::vector<_Ty> &' c:\users\niklas\multiplaya\sfml >test\sfml test\view\worldview.cpp 402 1 SFML_Test
最佳答案
问题在于多态性在 vector 级别不起作用,但在它们包含的指针级别起作用。所以std::vector<Derived*>
永远不能作为 std::vector<Base*>
传递,因为它们是完全不同的类型。但是,您可以填写 std::vector<Base*>
指向 Derived*
的指针.
所以,你应该将你的子弹 vector 声明为
std::vector<Drawable*> bullets;
并填入BulletView*
,例如:
bullets.push_back( new BulletView( some args) );
drawVector(bullets);
注意:在上面的代码中,我回避了动态分配对象所有权的问题。显然必须有一些机制来删除 BulletViews
在适当的时候。
关于C++ Vector 遍历抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10445826/