Mam problem z zaimplementowaniem konstruktora kopiującego, który jest wymagany do wykonywania głębokich kopii na moim prefabrykowanym aktorze potomnym, który jest

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

Musi mieć również możliwość rekurencji, ponieważ PrefabActor * wewnątrz może mieć kolejną warstwę kontenera podrzędnego.

Coś takiego:

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

Oto moja realizacja:

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

};
2
Ng MT 4 listopad 2018, 15:30
2
Jeśli chcesz głębokiej kopii, po co używać wskaźników? Rekurencja nie jest problemem, niezależnie od tego musisz zaimplementować kopię ctora PrefabActor.
 – 
n. 1.8e9-where's-my-share m.
4 listopad 2018, 15:35
Który wskaźnik masz na myśli? masz na myśli std::unordered_map jako PrefabActor * ?
 – 
Ng MT
4 listopad 2018, 15:46
1
To znaczy, dlaczego nie std::unordered_map<unsigned, PrefabActor>?
 – 
n. 1.8e9-where's-my-share m.
4 listopad 2018, 15:53

1 odpowiedź

Najlepsza odpowiedź

Będziesz musiał ręcznie skopiować wpisy:

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

Oczywiście musisz również zmienić obiekt nadrzędny dzieci.

Powinieneś również wskazać, kto jest właścicielem obiektów PrefabActor. W tym miejscu występuje potencjalny wyciek pamięci.

2
Matthieu Brucher 4 listopad 2018, 15:39
For (auto it = rhs.child_actor_container.begin(); it != rhs.child_actor_container.end(); ++it , ++child_key) { PrefabActor * child_prefab = new PrefabActor(*(it->second)); child_prefab->SetParentPointer(to); child_actor_container.emplace(child_key, child_prefab); } czy to jest ok?
 – 
Ng MT
4 listopad 2018, 16:21
Co to jest child_key? Myślałem, że chcesz głębokiego klona. Jeśli masz dodatkowe identyfikatory, to tak, musisz dostosować ten kod do rzeczy, których nie umieściłeś w swoim pytaniu.
 – 
Matthieu Brucher
4 listopad 2018, 16:43
Child_key tylko wartość bez znaku, która jest child_prefab_actor_key
 – 
Ng MT
4 listopad 2018, 17:04
Och, OK. Jak już powiedziałem, musisz dostosować kod do specyfiki tego, jak śledzisz i identyfikujesz swoje obiekty.
 – 
Matthieu Brucher
4 listopad 2018, 17:32