【问题标题】:Assignment operator overload not getting called赋值运算符重载没有被调用
【发布时间】:2013-04-29 13:02:15
【问题描述】:

我有两个类,Database 和 Record。

class Database {
    private:
        Record* head;
    public:
        Database(Record*);
        Database();
        Database(const Database&);

        Database& operator= (const Database &data);
};

class Record {
    public:
        Record(std::string, std::string, int, int, std::string);
        Record(const Record&);
        Record();

        Record* next;
};

现在当我这样做时

Database PM1, PM2;
//operations on PM1
PM2 = PM1;

所发生的只是将 PM1 中的值分配给 PM2。永远不会调用赋值重载。我不知道为什么会发生这种情况。我也尝试过调试,但从未输入过该功能。我做错了什么?

编辑:这是重载函数,它可能不正确,但我还没有能够测试它,因为我什至无法让它运行。

Database& Database::operator= (const Database &data) {
    if(this == &data)
        return *this;
    if(data.head == NULL) {
        this->head = NULL;
        return *this;
    }
    Record *curr1, *curr2;
    curr1 = new Record(*(data.head));
    this->head = curr1;
    for(curr2 = data.head->next; curr1 != NULL && curr2 != NULL; curr1 = curr1->next) {
        curr1->next = new Record(*curr2);
        curr2 = curr2->next;
    }
    return *this;
}

【问题讨论】:

  • 你怎么知道你的赋值运算符永远不会被调用?
  • 你不是在调试发布版本吗?
  • 代码看起来是正确的,如果它真的像这里显示的那样。我会尝试清理和重建程序。还要在赋值之前添加一个日志/断点,在赋值运算符中添加另一个日志并运行以查看它是否命中该行。可能永远不会到达分配的行!
  • 是的,它与作业直接匹配,我逐步完成,它就继续。从不进入过载。我在重载中也有一个断点,而且它永远不会停止。我一直在考虑这个问题,但我不知道该怎么做,除了将我所有的丑陋代码发布在 github 上或其他什么地方。对于应该如此简单的修复来说,这似乎是不必要的。
  • 对我来说似乎是正确的。可以写赋值运算符重载函数的主体吗?

标签: c++ overloading copy-constructor equivalent


【解决方案1】:

我认为是因为您的数据库类中有指针,并且我猜您没有处理您认为重载运算符不起作用的问题。 你做浅拷贝。所以你需要处理它!

【讨论】:

  • 那么如果类中有一个指针,它只是做一个浅拷贝?我怎样才能让它去过载?我在重载中处理了指针,所以这不像我只是将指针设置为相等然后获得相同的引用。我应该做些什么来处理指针?
  • 看看这个页面你会找到所有的。 learncpp.com/cpp-tutorial/912-shallow-vs-deep-copying
  • @mrobinson7627 您的代码看起来正确。我不知道这个答案想告诉你什么,但作者可能会很好地阅读问题和发布的代码。您对赋值运算符和复制构造函数的覆盖正是您应该做的处理动态成员并遵守三规则(尽管您似乎缺少清理这些成员的虚拟析构函数,但那是另一个问题)。肯定有其他问题,因为您似乎做对了。
【解决方案2】:

为了调用复制分配函数,可能需要事先实例化对象。

// So instead of doing this:
Database PM1, PM2;
PM2 = PM1;

// Try this:
Database *PM1 = new Database();
Database *PM2 = new Database();
*PM2 = *PM1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2013-03-30
    • 2013-02-14
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多