C ++ 11 — 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;

Я даже близко? Если нет, как я могу это исправить?

0

Решение

Здесь есть пара вопросов.

  1. ++it; повторяется в цикле for.
  2. ClassA copy = obj; Как только вы вернетесь из конструктора копирования, переменная copy будет уничтожена. Итак, вы не делаете здесь никакой копии.
  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();
}
1

Другие решения

Других решений пока нет …