2012-10-08 112 views
0

搜索周圍,找不到任何意見我的問題。我正在嘗試爲具有包含指向抽象基類的指針的私有變量的類創建副本構造函數。C++複製構造基類指針

#include "BaseClass.hh" 

ClassA::ClassA() 
{ } 
/* Copy construct a ClassA object */ 
ClassA::ClassA(const ClassA& obj) 
{ 
    std::map<std::string, BaseClass*>::const_iterator it; 
    //ClassA copy = obj; 

    for(it = obj.ind.begin(); it != obj.ind.end(); it++) 
    { 
     copy.ind[it->first]=(it->second); 
    } 
} 

//in .hh file 
private: 
std::map<std::string, BaseClass*> ind; 

我是否關閉?如果沒有,我該如何解決這個問題?

+1

您的意思是++以及it ++在'for'子句中嗎? –

+0

BaseClass和ClassA如何相關? ClassA是否公開繼承BaseClass? – Jagannath

+0

我認爲你必須解釋的第一件事是:爲什麼你需要一個自定義的拷貝構造函數?這個人爲你提供什麼,你希望它沒有?還有其他人指出:ClassA是否繼承自BaseClass?或者它是一種不同的關係? – Rollie

回答

1

這裏有幾個問題。

  1. ++it;在for循環中重複。
  2. ClassA copy = obj;一旦你從複製構造函數返回,變量副本被銷燬。所以,你在這裏沒有做任何拷貝。
  3. 如果您希望將映射中的值作爲指針,則需要爲指針變量分配內存。
  4. 由於您已將地圖中的value指定爲BaseClass指針,因此您需要知道要爲其分配內存的確切類型。 key可以在這裏幫助。

我在這裏帶着C++ 11標籤的自由。這只是爲了說明的目的。理解並實施它,因爲它符合您的需求。如果你觀察,我沒有在這裏釋放記憶。

class BaseA 
{ 
public: 
    virtual void Print() = 0; 
}; 

class Derived1A : public BaseA 
{ 
    virtual void Print() 
    { 
     std::cout << "Derived1A\n"; 
    } 
}; 

class Derived2A : public BaseA 
{ 
    virtual void Print() 
    { 
     std::cout << "Derived2A\n"; 
    } 
}; 


std::map<std::string, std::function<BaseA*()>> factory; 


class ClassA 
{ 

public: 
    ClassA() 
    { 
     for (auto it = factory.begin(); it != factory.end(); ++it) 
     { 
      typedef std::pair<const std::string, BaseA*> Pair; 
      mapType_m.insert(Pair(it->first, it->second())); 
     } 
    } 

    ClassA(const ClassA& other) 
    { 
     for (auto it = other.mapType_m.begin(); it != other.mapType_m.end(); ++it) 
     {   
      typedef std::pair<const std::string, BaseA*> Pair; 
      mapType_m.insert(Pair(it->first, factory[it->first]())); 
     } 
    } 

    void Print() 
    { 
     for (auto it = mapType_m.begin(); it != mapType_m.end(); ++it) 
     { 
      std::cout << "key:" << it->first << "\tValue:"; 
      it->second->Print() ; 
      std::cout << "\n"; 
     } 
    } 

private: 
    std::map<std::string, BaseA*> mapType_m; 

}; 


int main() 
{ 
    factory["Derived1A"] = []() { return new Derived1A(); }; 
    factory["Derived2A"] = []() { return new Derived2A(); }; 


    ClassA c1; 
    ClassA c2 = c1; 
    c2.Print(); 
} 
+0

1.感謝您注意,這是來自以前的while循環。刪除它。 – user1727556

+0

2.好的,理解這個部分。 3.和4.我也明白,我需要分配內存,但我不知道如何去做,因爲它是一個抽象基類,這意味着BaseClass * copy = New BaseClass;不起作用?我也不知道你的意思是鑰匙可以在這裏幫助:( – user1727556

+0

哇!謝謝你抽出時間向我詳細解釋這一點,現在我明白你的意思了,這真的幫助了我,再次感謝! – user1727556