2012-10-08 108 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