如何启动地图的复制构造函数?

How to initiialise the copy constructor for a map?

本文关键字:复制 构造函数 地图 何启动 启动      更新时间:2023-10-16

我已经为此敲打了至少两个小时了,这里可能缺少我的知识空白。基本上,我必须为复制构造函数编写函数,无论如何我都无法让它工作。我在这里绝对忽略了一些东西,因为这似乎并不那么复杂。

// Definition default constructor
Members::Members()
{
members = new map<string, set<string>>;
numOfMembers = 0;
}
// Definition copy constructor
Members::Members(const Members& mem)
{
numOfMembers = mem.numOfMembers;
}

我似乎根本无法执行这个程序,它停在复制构造函数上,我只是不确定从这里开始。仍然在缠绕着STL地图。希望得到任何帮助或解释!谢谢!

给定标头函数:

class Members
{
// Overloaded insertion operator (friend)
friend std::ostream& operator<<(std::ostream& out, const Members& mem);

public:
// Default constructor
Members();
// Copy constructor
Members(const Members& mem);

如果你在任何一个构造函数中都不需要任何特殊的逻辑,不要定义它们,默认的逻辑将自动放置到位,它们就可以很好地完成工作。

如果必须定义它们:

// Definition default constructor (note: maps are initialized when you define them)
Members::Members():numOfMembers(0)
{
}
// Definition copy constructor
Members::Members(const Members& mem)
{
numOfMembers = mem.numOfMembers;
// if you want the map as well
members = mem.members;
}

由于它是一个结构,您可能需要使用new创建members(顺便说一句,这里似乎绝对没有理由使用它,请参阅 farbiondriven 的答案(。然后,您必须从其他类复制members。这是细分:

// Definition copy constructor
Members::Members(const Members& mem)
{
members = new map<string, set<string>>; // Create memebers
*members = *mem.members; // Copy
numOfMembers = mem.numOfMembers;
}

这可以通过使用map的复制构造一步完成,该构造在一个步骤中创建和复制(请参阅参考文献中的数字(3((:

// Definition copy constructor
Members::Members(const Members& mem)
{
members = new map<string, set<string>>(*mem.members); // Call map's copy constructor
numOfMembers = mem.numOfMembers;
}

不要忘记delete members;类的析构函数。另外,请注意,这是一个糟糕的设计:你真的应该使用farbiondriven的答案,或者至少使用像std::unique_ptr这样的自动指针。