0

セットを使用していくつかの TileObjects (ユーザー定義クラス) を参照し、それらをループしてそれに応じて行動したり、特定のものを見つけて削除したりしたいと考えています。

問題は、私がやりたいことの 1 つは、SDL_Surface* を取り、それに画像を適用するメンバー関数 'render' にアクセスすることです。セットの外では、これは正常に機能します。ただし、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 メソッドではない場合 (そうであると思います)、表示されているエラーが発生します。1 つのオプションは、レンダリング メソッドを次のような「const メソッド」に変更することです。

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

メソッドを const にすることができない場合は、おそらく、以前のアプローチでセットを埋めるのに間違いがないかどうかを確認する必要があります。新しい TileObject を作成して std::set に挿入する必要がある場合があります。また、完了後に削除することを忘れないでください。

または、別のオプションは、std::set の代わりに std::vector を使用することです。

于 2012-11-05T12:38:17.377 に答える