Хранение объектов в нескольких списках shared_ptr - PullRequest
0 голосов
/ 21 октября 2019

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

...