-2
            Sprite1 *enemy = new Sprite1(100, 100, "enemy.bmp", *screen);
            enemy->DrawJon(screen);

            enemyList.insert(enemyList.end(), *enemy);

何らかの理由で、敵がリストに保存されていません。何か案は?

編集:

また、オブジェクトにアクセスして病棟後に使用する方法は次のとおりです。

for (int g=0; g<enemyList.size(); g++)
            {
                Sprite1 enemyToMove = enemyList.at(g); //.at(g);
                enemyToMove.MoveJon(0, 50, screen);
            }

編集:

ですから、これがクローズされたとしても、解決策が何であるかを人々に知ってもらいたいと思っています. クラスのプロパティを設定するコンストラクターを作成していませんでした。最後に、デフォルトのコンストラクターとセッターメソッドでこれを機能させることができました

4

3 に答える 3

3

の末尾の前にオブジェクトのコピーを挿入しますenemyList。このために、あなたは本当に好むはずenemyList.push_back(*enemy)です。ただし、コピーですのでご注意ください。の内部と外部で同じオブジェクトを参照したい場合はstd::vector、ポインターのベクトル (できればスマート ポインター) が必要になります。例えば:

std::vector<std::shared_ptr<Sprite1>> enemyList;

std::shared_ptr<Sprite1> enemy(new Sprite1(100, 100, "enemy.bmp", *screen));
enemy->DrawJon(screen);

enemyList.push_back(enemy);

または、 を使用しstd::vector<std::reference_wrapper>ます。

ポインターまたは を含むように変更した場合、次のように敵にアクセスできます。std::vectorstd::reference_wrapper

std::shared_ptr<Sprite1> enemyToMove = enemyList[g];
// or
std::shared_ptr<Sprite1>& enemyToMove = enemyList[g];

まだ s を直接含んでいる場合は、 orSprite1によって返されるオブジェクトへの参照を保持する必要があります。それ以外の場合は、それをコピーします。operator[]at

Sprite1& enemyToMove = enemyList[g];
于 2012-12-17T22:05:40.887 に答える
1

投稿したコードenemyはリストに保存されておらず、敵のコピーを保存しています。

あなたはおそらく、enemyList のタイプを a に変更したいと思うでしょうstd::vector<Sprite1*>

enemyList.insert(enemyList.end(), enemy);

push_back()オブジェクトを挿入します(または簡潔にするために置き換えます)。

このアプローチは、たとえばリストをクリアするときに、割り当てられたメモリを管理する必要があることを意味しますが、今のところはこれで十分です。

于 2012-12-17T22:07:44.710 に答える
0

.end() は、ベクターに格納されている最後の要素の次の要素を返します。そのため、物を挿入するのに無効な位置です。

ベクターの末尾にオブジェクトを追加するには、.push_back() を使用します。

于 2012-12-17T22:05:38.620 に答える