C++ Vector 遍历抽象类

标签 c++ vector iterator sfml

背景资料: 我和几个 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/

相关文章:

C++:使用作为指向仅单实例类实例化的指针的全局变量是否不好?

C++ vector/链表混合

c++ - 提高 std::vector 的存储容量/性能

c++ - 迭代器增量导致clang和gcc的结果不同

c++ - 如何获取我的驱动器中具有特定扩展名的所有文件的列表?

c++ - ffmpeg 在线录制

c++ - 考虑到所有可能的编码,是否有将 wstring 转换为 std::string 的通用方法?

C++ vector 操作错误

java:重置ListIterator?

c++ - 如何加速我的面向对象的 Iterator 类?