Я работаю над простой игрой, для которой мне нужно хранить игровые объекты в контейнерах. Я хочу хранить их в разных std :: list (объекты, которые выводятся на экран каждый кадр, объекты, которые нужно обновлять каждый кадр и т. Д.), Чтобы я мог просто перебирать все объекты определенного типа, когда мне это нужно. Теперь некоторые объекты должны находиться в нескольких списках (некоторые из них отображаются и должны обновляться в каждом кадре), а иногда необходимо удалить один из всех списков, в которых он содержится. Объекты должны быть удалены при удалении из всех списков. Это упрощенный пример того, что у меня сейчас есть:
#include <iostream>
#include <memory>
#include <string>
#include <list>
class A
{
public:
A(std::string text)
{
message = text;
}
~A()
{
std::cout << "Deleted: " << message << std::endl;
}
std::string getMessage() { return message; }
private:
std::string message;
};
int main()
{
std::list<std::shared_ptr<A>> list1;
std::list<std::shared_ptr<A>> list2;
if(true) // to create scope
{
std::shared_ptr<A> tmp(new A("Test"));
list1.push_back(std::shared_ptr<A>(tmp));
list2.push_back(std::shared_ptr<A>(tmp));
} // tmp out of scope
// delete the object from both lists:
auto i = std::begin(list1);
while(i != std::end(list1))
{
if(i->get()->getMessage() == "Test");
list1.remove(*i);
list2.remove(*i); // the object gets deleted after this line
}
return 0;
}
Это работает, но на самом деле это кажется слишком сложным (я использую C # на работе, где эта задача тривиальна). У меня очень мало опыта в управлении памятью с использованием умных указателей. Я делаю что-то в корне неправильно?