C ++复制构造函数基类指针

时间:2012-10-08 02:12:27

标签: c++ c++11 copy-constructor abstract-base-class

搜索一下,找不到任何有关我问题的建议。我正在尝试为具有包含指向抽象基类的指针的私有变量的类创建复制构造函数。

#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 个答案:

答案 0 :(得分:1)

这里有几个问题。

  1. ++it;在for循环中重复。
  2. ClassA copy = obj;从复制构造函数返回后,变量副本将被销毁。所以,你这里没有做任何副本。
  3. 如果您希望将值作为指针放在地图中,则需要为指针变量分配内存。
  4. 由于您在地图中使用value作为BaseClass指针,因此您需要知道要为其分配内存的确切类型。 key可以提供帮助。
  5. 我在这里取得了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();
    }