Вчера я начал изучать C++, поэтому я довольно новичок в этом. (Я пришел из С#) Я пытаюсь создать пул с двумя векторами (активными и неактивными), поэтому, когда мне нужен элемент, я беру его из неактивного вектора и помещаю его в активную.
Я думаю, что мне нужно удалить указатель из неактивного, но сохранить элемент в памяти, не так ли? Как я могу это сделать?
Вот что у In до сих пор:
SpritePool::SpritePool(const char *p)
{
path = p;
}
CCSprite SpritePool::GetSprite(){
while(poolVectorInactive.size == 0){
AddSprite();
}
}
CCSprite SpritePool::AddSprite(){
CCSprite *s = CCSprite::create(path);
poolVectorInactive.push_back(*s);
return *s;
}
Попробуйте что-то вроде этого:
#include <algorithm>
#include <vector>
std::vector<CCSprite*>::iterator it = std::find_if(inactive.begin(), inactive.end(), [](CCSprite* sprite) { /* put your vector search logic (returning bool) here */ });
if (it != inactive.end())
{
active.push_back(*it);
inactive.erase(it);
delete *it;
}
Обратите внимание, что он использует лямбда-выражения (см., Например, http://www.cprogramming.com/c++11/c++11-lambda-closures.html), поэтому вам понадобится компилятор, совместимый с С++ 11. Если вы не можете позволить себе такую роскошь, напишите такую функцию, как:
bool matcher(CCSprite* sprite)
{
/* code here */
}
и измените эту часть:
std::vector<CCSprite*>::iterator it = std::find_if(inactive.begin(), inactive.end(), matcher);
Кроме того, если можно, попробуйте НЕ использовать необработанные указатели. Храните их, например, unique_ptr
или shared_ptr
, поэтому вам не нужно удалять их вручную. Это избавит вас от некоторых утечек и головных болей.