Как я могу переключить элемент с вектора на другой в C ++?

0

Вчера я начал изучать 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;

}
Теги:
dynamic
vector
cocos2d-x

1 ответ

0

Попробуйте что-то вроде этого:

#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, поэтому вам не нужно удалять их вручную. Это избавит вас от некоторых утечек и головных болей.

  • 1
    Cococ2d-x имеет собственную «автоматическую систему управления», называемую пулом автоматического освобождения, и использование общего указателя с CCObject (например, CCSprite) не является хорошей идеей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню