0

我想使用一个集合来引用一些 TileObjects(一个用户定义的类),这样我就可以遍历它们并采取相应的行动,或者找到一个特定的并删除它等等。

问题是,我想做的一件事是访问成员函数“render”,它接受一个 SDL_Surface* 并将图像应用到它。在片场之外,这很好用。但是,使用一组 TileObject* 如下

for(set<TileObject*>::iterator it = tileObjects.begin(); it != tileObjects.end(); ++it){
    (*it)->render(dest, offset, tileSheet);
}

表示图像不会出现在屏幕上。我可以使用一组 TileObjects,

for(set<TileObject>::iterator it = tileObjects.begin(); it != tileObjects.end(); it++){
    (*it).render(dest, offset, tileSheet);
}

但后来我得到“将'const Tileset'作为'this'传递的错误......”因为我想要访问的某些函数会更改值。

使用指针的成员函数在 SDL 中应用表面的正确方法是什么?

如果有帮助,我正在使用 GNU GCC 编译器和 Code::Blocks。

4

1 回答 1

1

插入到集合中的值不能就地更改,因为该值充当键,用于所有操作,例如插入和搜索。由于这个 (*i) 将是一个 T const,在您的情况下将是 const TileObject。如果 render 方法不是你的 const 方法,我想你会得到你看到的错误。您的一个选择可能是将渲染方法更改为“常量方法”,例如

void render(dest, offset, sheet) const {...

如果您无法将该方法设置为 const,您可能必须检查在之前的方法中填充集合时是否犯了任何错误。您可能必须创建一个新的 TileObject,然后将其插入 std::set 并记住在完成后删除。

或者,另一种选择是只使用 std::vector 而不是 std::set。

于 2012-11-05T12:38:17.377 回答