Конструктор копирования C ++ 17, глубокая копия на std :: unordered_map - PullRequest
0 голосов
/ 04 ноября 2018

У меня проблемы с реализацией конструктора копирования, необходимого для выполнения глубоких копий моего готового дочернего актера, который является

std::unordered_map<unsigned, PrefabActor *> child_actor_container;

Он также должен быть в состоянии повторяться, поскольку внутри PrefabActor * может быть еще один слой дочернего контейнера актера.

Примерно так:

 layer
    1st   | 2nd   | 3rd
    Enemy
         Enemy_Body
                  Enemy_Head
                  Enemy_hand and etc
         Enemy_Weapon

Вот моя реализация:

class DataFileInfo
{
public:
    DataFileInfo(std::string path, std::string filename );
    DataFileInfo(const DataFileInfo & rhs);
    virtual ~DataFileInfo();
    // all other functions implemented here
private:
    std::unordered_map<std::string, std::string> resource_info;
    bool selection;
};

class PrefabActor : public DataFileInfo
{
public:

    PrefabActor(std::string path, std::string filename , std::string object_type, PrefabActor * parent_actor = nullptr);
    PrefabActor(const PrefabActor & rhs);

    ~PrefabActor();

    // all other function like add component, add child actor function are here and work fine 

private:
    unsigned child_prefab_actor_key; // the id key
    PrefabActor* parent_prefab_actor; // pointer to the parent actor

    std::unordered_map<ComponentType, Component*> m_ObjComponents; // contains a map of components like mesh, sprite, transform, collision, stats, etc.

    //I need to be able to deep copy this unordered map container and be able to recursive deep copy 
    std::unordered_map<unsigned, PrefabActor *> child_actor_container; // contains all the child actors

    std::unordered_map<std::string, std::string> prefab_actor_tagging; // contains all the tagging

};

1 Ответ

0 голосов
/ 04 ноября 2018

Вам нужно будет вручную скопировать записи:

PrefabActor(const PrefabActor & rhs)
{
    for(const auto& entry:  rhs.child_actor_container)
    {
        child_actor_container[entry.first] = new PrefabActor(*entry.second);
    }
}

Конечно, вам также необходимо изменить родительский объект для детей.

Вы также должны указать, кому принадлежат PrefabActor объекты. Здесь возможна утечка памяти.

...