2016-04-12 30 views
0

私の頭の中を何度も探し回って、私はまだこれを理解することができません。スマートポインタを使用していません。助けてください。std :: unique_ptr深いコピーを作成しようとすると、削除された関数を参照しようとしています

クラスAのディープコピーを作成しようとしていますが、このエラーが発生しています。このエラーは、Microsoftのxutility.cppの "Template Function Copy"を参照してください。

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'これは浅いコピーを作成しようとする - それがしようとしますポインタが指すデータではなくポインタをコピーします。もちろん、 'unique_ptr'はコピーできません - それが"ユニーク "になります。 'ClassB :: Copy'から' SetVector'を呼び出すことを意味しましたか? –

+0

** m_vectorclassA = fromclassB.m_vectorclassA **これはそれでした。私は、実際のコードではそれを一切見ていませんでした。これは、単純化されたコードを長く貼り付ける方法です。ありがとう!また、私は** ClassB :: Copy **から** SetVector **を呼び出すつもりはありませんでした。 – user2832424

答えて

0

m_vectorclassA = fromclassB.m_vectorclassAユーザーイゴールTandetnikによって指さよう

が問題を引き起こし行し

関連する問題