2016-04-12 5 views
0

Nachdem ich alles durchsucht und mich viel am Kopf gekratzt habe, kann ich das immer noch nicht herausfinden. habe lange nicht intelligente Zeiger, Vektoren verwendet. Bitte helfen Sie.std :: unique_ptr Versuch, eine gelöschte Funktion zu referenzieren, wenn man versucht, eine tiefe Kopie zu erstellen

Ich versuche, tiefe Kopie der Klasse A zu machen, und ich bekomme diesen Fehler. Der Fehler verweist auf "Template Function Copy" von xutility.cpp von Microsoft, wenn dies wichtig ist.

classA 
{ 
    public: 
    ClassA (const ClassA& origClassA) 
    { 
     ClassA::Copy(origClassA); 
    } 

    ClassA & ClassA ::operator=(const ClassA & origClassA) 
    { 

     if (this != &origClassA) 
     { 
      ClassA ::Clear(); 
      ClassA ::Copy(origClassA); 
     } 

     return *this; 
     } 

     void ClassA ::Clear() 
    { 
     m_nId = 0; 
     m_pType = nullptr; 
     } 

     void ClassA ::Copy(const ClassA & fromClassA) 
     { 
      m_nId = fromClassA .m_nId; 

      if (fromClassA.m_pType) 
      { 
       if (!m_pType) 
       m_pType = std::make_unique<int>(); 
       *m_pType = *fromClassA.m_pType; 
      } 

     } 
    private: 
     int m_nId; 
     std::unique_ptr<int> m_pType; 
    } 

Class B 
{ 
    public: 
     ClassB(const ClassB& origClassB) 
     { 
     classB::Copy(origClassB); 

     } 

     classB& operator=(const classB& fromclassB) 
     { 
      if (this != &origClassA) 
      { 
      classB::Clear(); 
      classB::Copy(origClassA); 
      } 

      return *this; 


     } 

     void classB::Clear() 
     { 
      m_vectorclassA.Clear(); 
     } 

     void Copy(const classB& fromclassB) 
     { 
      m_vectorclassA = fromclassB.m_vectorclassA; 
     } 


     void SetVector(const std::vector<std::unique_ptr<classA>>& vectorclassA ) 
     { 
      std::vector<std::unique_ptr<classA>>::const_iterator Iterator; 

      for (Iterator = vectorclassA.begin(); Iterator != vectorClassA.end(); Iterator++) 
      { 
       m_vectorclassA.push_back(std::make_unique<classA>(*(*Iterator))); 
      } 
     } 

    private: 
    std::vector<std::unique_ptr<classA>> m_vectorclassA; 
    } 
+0

'm_vectorclassA = fromclassB.m_vectorclassA' Diese versucht, eine flache Kopie zu machen - es versucht, um Zeiger zu kopieren, nicht die Daten, auf die sie zeigen. Natürlich kann 'unique_ptr' nicht kopiert werden - das macht es" einzigartig ". Wolltest du 'SetVector' von' ClassB :: Copy' aufrufen? –

+0

** m_vectorclassA = fromclassB.m_vectorclassA ** Das war es. Ich habe es in meinem eigentlichen Code nicht gesehen, der viel länger ist und den vereinfachten Code eingefügt hat. Vielen Dank! Außerdem wollte ich nicht ** SetVector ** von ** ClassB :: Copy ** nennen. – user2832424

Antwort

0

m_vectorclassA = fromclassB.m_vectorclassA

Linie war das Problem verursacht, wie durch Benutzer Igor Tandetnik wies