繁体   English   中英

C ++ Vector迭代抽象类

[英]C++ Vector iterate over abstract class

背景信息:我和几个朋友正在使用帮助och sfml和box2d在C ++中构建这个平台游戏,用于学校作业。 其中一个要求是我们遵循“MVC模式”。

我们为模型创建了Bullet和Character等类。 并且BulletView和CharacterView(都继承了sf :: Drawable,它是一个抽象类)用于视图。

而不是重复绘制代码,并有两个方法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向量声明如下:

std::vector<BulletView*> bullets;

虽然不能让这个工作。 而且我对C ++有点新意,所以请怜悯! 我试过搜索,但没有找到非常具体的答案。

编译时得到的错误。

错误8错误C2679:二进制'=':找不到运算符,它采用类型'std :: _ Vector_const_iterator <_Myvec>'的右手>操作数(或者没有可接受的>转换)c:\\ users \\ niklas \\ multiplaya \\ sfml test \\ sfml test \\ view \\ worldview.cpp 409> 1 SFML_Test

错误7错误C2664:'mp :: WorldView :: drawVector':无法将参数1从>'std :: vector <_Ty>'转换为'const std :: vector <_Ty>&'c:\\ users \\ niklas \\ multiplaya \\ sfml> test \\ sfml test \\ view \\ worldview.cpp 402 1 SFML_Test

问题在于,多向性不能在向量的层面上起作用,而是在它们包含的指针的层次上。 所以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

使用模板函数,而不是使用多态向量:

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

你得到的错误来自赋值it = vector.begin(); 在你的for循环中。 问题是你试图将iteratorit )分配给const iteratorvector.begin() )。 您不能使用const迭代器迭代数据结构,因为它的值会在每次迭代时更改。 此外,当使用迭代器遍历数据结构时,您应该使用operator !=而不是operator <

如果从const std::vector& vector删除const ,应该可以正常工作。

希望这可以帮助!

您正在模仿复合设计模式

但是你的错误是:你应该写替换<by!=因为它是迭代器而不是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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM