【问题标题】:How to initiialise the copy constructor for a map?如何初始化地图的复制构造函数?
【发布时间】:2020-06-15 08:57:22
【问题描述】:

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

// 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);

【问题讨论】:

  • 为什么是'新地图'?你能展示全部内容吗?
  • 当然。基本上,我正在尝试实现“成员类”并且有三个文件。 Members.h、Members.cpp(我现在正试图弄清楚)和 Main.cpp(我正在测试的地方)。 Members.h 已经拥有我需要的所有成员变量。 members 是指向动态 STL 映射的指针;映射对中的第一项是存储成员的字符串,映射对中的第二项是存储该成员的朋友列表的 STL 字符串集。 numOfMembers 是一个存储成员总数的 int。
  • 动态 STL 映射并不意味着您需要“新”,STL 中的容器是动态的。不确定您需要成员数量,您可以查看地图的大小
  • 它在哪里崩溃?你能用这些类展示程序吗?

标签: c++ dictionary copy-constructor


【解决方案1】:

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

如果你必须定义它们:

// 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;
}

【讨论】:

  • 我已经尝试过了,不幸的是,它仍然无法正常工作。这是一个班级作业,所以我得到了头文件,我必须自己填写函数。我正在尝试做的一个小 sn-p 是(开个玩笑,格式在 cmets 中很糟糕,我会在上面发布。)
  • 我编辑了您的答案以与您的标题兼容。你应该避免使用“新”。
【解决方案2】:

由于它是一个构造,您可能需要使用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 的复制构造一步完成,它在一个步骤中创建和复制(参见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; 你的类的析构函数。另外,请注意这是不好的设计:您应该真正使用 farbiondriven 的答案,或者至少使用像 std::unique_ptr 这样的自动指针。

【讨论】:

  • 天哪。非常感谢,我之前试图实现类似的东西,但我的语法知识是垃圾,我仍在尝试围绕 STL 和指针。
  • 如果这能解决问题,“在复制构造函数处停止”是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2012-08-14
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多