2015-04-13 1 views
0

je la classe Store suivante:Pourquoi attribuer un objet à une carte produisant un objet vide?

class Store 
{ 
    public: 
     Store() : m_npc_id(0) 
     { 

     } 

     Store(const int npc_id, 
      vector<std::string> categories, 
      vector<StoreItem> store_items) : 
      m_npc_id(npc_id) 
     { 
      m_categories = categories; 
      m_store_items = store_items; 
     } 

     Store& operator=(const Store& rhs) 
     { 
      return *this; 
     } 

     vector<std::string> GetCategories() const; 
     vector<StoreItem> GetItems() const; 
    private: 
     const int m_npc_id; 
     vector<std::string> m_categories; 
     vector<StoreItem> m_store_items; 
}; 

Quand j'appelle le code suivant, l'objet est stocké correctement dans la variable store ...

const Store& store = Store(npc_id, category.second, items[npc_id]); 

Cependant, dès que je tente de insérer la variable store dans la carte de tous Stores, cela ne fonctionne pas ... L'objet qui est stocké est vide, et prend les valeurs constructeur par défaut pour Store.

for (auto &category : categories) 
{ 
    // In this case, category.second is a string value 
    // items[npc_id] is a StoreItem 

    const int npc_id = category.first; 

    const Store& store = Store(npc_id, category.second, items[npc_id]); 
    stores[npc_id] = store; 
} 
+3

Votre opérateur d'affectation n'attribue pas l'objet. –

+0

Pourquoi votre 'Store & operator = (const Store & rhs)' est-il vide? Si vous mettez un point d'arrêt à l'intérieur de cette méthode, vous remarquerez qu'il sera appelé à partir de cette ligne: 'stores [npc_id] = store;' – cha

Répondre

4

Votre opérateur d'affectation de copie est complètement faux.

stores[npc_id] = store; 

Si npc_id ne se trouve pas sur la carte, la carte crée tout d'abord une nouvelle Store en utilisant le constructeur par défaut. Ensuite, il tente de copier attribuer à partir de store. Et il copie en utilisant ce code:

{ 
    return *this; 
} 

Compte tenu du fait que vous avez un membre const, il semble être votre intention d'interdire les copies. Dans ce cas, le code est encore plus faux. Pour interdire les copies, utilisez Store& operator=(const Store& rhs) = delete;.

Et vous remarquerez que stores[npc_id] = store; ne compile plus. Au lieu de cela, vous devrez faire quelque chose pour éviter la copie.

stores.emplace(std::piecewise_construct, 
      std::forward_as_tuple(npc_id), 
      std::forward_as_tuple(npc_id, category.second, items[npc_id])); 

Vous n'aimez pas ce code? Rendre Store copiable à la place:

class Store 
{ 
    public: 
     Store() : m_npc_id(0) {} 

     Store(const int npc_id, 
      vector<std::string> categories, 
      vector<StoreItem> store_items) 
     : 
      m_npc_id(npc_id), 
      m_categories(std::move(categories)), 
      m_store_items(std::move(store_items)), 
     {} 

     const vector<std::string>& GetCategories() const; 
     const vector<StoreItem>& GetItems() const; 
    private: 
     int m_npc_id; 
     vector<std::string> m_categories; 
     vector<StoreItem> m_store_items; 
}; 

stores[npc_id] = store; //now this works! 
+0

Le deuxième bit était ce dont j'avais besoin, merci! – Ricky