【问题标题】:Why the operator overloading == is not working? [closed]为什么运算符重载 == 不起作用? [关闭]
【发布时间】:2020-10-09 14:12:10
【问题描述】:

我需要使用重载== 检查这两个向量是否相等,但它始终只工作else 语句。

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
class Set {
public:
    vector<int> mult;
    friend bool operator ==(const Set&, const Set&);
};
bool operator ==(const Set& a, const Set& b) {
    return (a.mult == b.mult);
}


int main()
{
    Set* set_1 = new Set;
    Set* set_2 = new Set;
    for (int i = 1; i <= 5; i++)
       set_1->mult.push_back(i);
    for (int i = 1; i <= 5; i++)
        set_2->mult.push_back(i);

    if (set_2 == set_1) {
        cout << "True ";
    }
    else {
        cout << "False";
    }
}

【问题讨论】:

  • set_1Set*,而不是 Set。你为什么要使用set_1set_2 的指针?投票结束是一个错字。摆脱指针。
  • 那么如何分配动态内存呢?
  • 这里为什么需要动态分配?
  • 这是我的任务要求
  • 你能发布你的要求吗?他们很可能希望 Set 使用动态分配,而不是 main

标签: c++ overloading operator-keyword


【解决方案1】:

set_1set_2 都不是集合。它们是指向集合的指针。您正在比较指针而不是集合,因此您的比较运算符 - 接受集合引用操作数 - 将不会被调用。

当你比较一个指针和另一个指针时,你是在比较它们是否指向同一个对象。 set_1set_2 指向不同的对象,因此不比较相等。

所以,您的问题不是您的运算符重载不起作用,而是您一开始没有使用该运算符重载。要解决这个问题,您需要比较指向的集合而不是指针。为了获得指向集合的引用,您可以使用间接运算符通过指针进行间接引用。

或者更好的是,您可以一开始就使用 set 变量。似乎没有理由使用动态分配集合。


附:避免拥有裸指针。您的程序泄漏了内存。

【讨论】:

  • 那个比较运算符不能接受指针。已经有一个内置的== 用于指针。
【解决方案2】:

对 Set 使用继承,而不是在类中使用向量成员。如果您是动态分配的 Set,请在之后清理。

#include <iostream>
#include <vector>

class Set : public std::vector<int>
{};

int main()
{
    Set * pa = new Set; //If dynamic allocation is mandatory
    pa->push_back(3);

    Set * pb = new Set;
    pb->push_back(3);

    if (*pa == *pb) //Uses the inherited == operator from std::vector<int>
    {
        std::cout << "a=b" << std::endl;
    }
    else
    {
        std::cout << "a<>b" << std::endl;
    }

    delete pa; //Clean up!
    delete pb;
}

【讨论】:

  • 虽然这解决了编码问题,但从不打算用作基类的类(在本例中为std::vector&lt;int&gt;)派生通常是个坏主意。原来的设计是合适的;这种重新设计不是。
  • @PeteBecker 我完全同意你的观点,因为我想我们不知道 OP 可能会如何使用该类(例如通过基类指针将 Set 存储在某处)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多