如何初始化地图的复制构造函数?

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.

这样的自动指针