这里有几个问题。
++it;
在 for 循环中重复。
ClassA copy = obj;
一旦你从拷贝构造函数返回,变量拷贝就会被销毁。所以,你在这里没有做任何复制。
- 如果您希望将值作为指针放入映射中,则需要为指针变量分配内存。
- 由于您
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();
}