2016-04-12 24 views
0

Başı çok fazla araştırdıktan ve kafamı çizdikten sonra, bunu hala çözemiyorum. Daha önce akıllı işaretçiler, vektörler kullanmadım. Lütfen yardım et.std :: unique_ptr Derin bir kopya oluşturmaya çalışırken silinen bir işleve başvurmaya çalışılıyor Kopyalama

Sınıf A'nın derin kopyasını yapmaya çalışıyorum ve bu hatayı alıyorum. Hata, microsoft'un xutility.cpp'nin "Şablon İşlev Kopyası" için önemli olup olmadığını belirtir. Kullanıcı İgor Tandetnik tarafından işaret olarak

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

'Bu sığ bir kopyasını yapmak için çalışır m_vectorclassA = fromclassB.m_vectorclassA' - bu çalışır İşaretçiler, işaret ettikleri veriyi kopyalamak için değil. Elbette, 'unique_ptr' kopyalanamaz - bu onu" benzersiz "yapan şeydir. "SetVector", "ClassB :: Copy" den mi demek istediniz? –

+0

** m_vectorclassA = fromclassB.m_vectorclassA ** Bu buydu. Gerçek kodumda hiç görmedim ki bu daha uzun ve basitleştirilmiş kodu yapıştırdı. Teşekkürler! Ayrıca ** SetVector ** 'dan ** ClassB :: Copy **' i aramak istemedim. – user2832424

cevap

0

soruna neden çizgiyi m_vectorclassA = fromclassB.m_vectorclassA oldu