如何初始化地图的复制构造函数?
How to initiialise the copy constructor for a map?
我已经为此苦苦思索了至少两个小时,我的知识可能存在遗漏。基本上,我必须为复制构造函数编写函数,无论如何我都无法让它工作。我完全忽略了这里的一些东西,因为这看起来并不那么复杂。
// 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 地图。将不胜感激任何帮助或解释!谢谢!
给定 Header 个函数:
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 的回答)。那么你必须从另一个class复制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
的复制构造,一步创建和复制(参见 the reference 中的编号 (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;
你的 class 的析构函数。另外,请注意这是一个糟糕的设计:你真的应该使用 farbiondriven 的答案,或者至少使用像 std::unique_ptr
.
这样的自动指针
我已经为此苦苦思索了至少两个小时,我的知识可能存在遗漏。基本上,我必须为复制构造函数编写函数,无论如何我都无法让它工作。我完全忽略了这里的一些东西,因为这看起来并不那么复杂。
// 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 地图。将不胜感激任何帮助或解释!谢谢!
给定 Header 个函数:
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 的回答)。那么你必须从另一个class复制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
的复制构造,一步创建和复制(参见 the reference 中的编号 (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;
你的 class 的析构函数。另外,请注意这是一个糟糕的设计:你真的应该使用 farbiondriven 的答案,或者至少使用像 std::unique_ptr
.