【问题标题】:Realize "-" operator overloading as a friend function of class实现“-”运算符重载作为类的友元函数
【发布时间】:2020-02-21 13:13:19
【问题描述】:

我尝试用“-”来实现集合的差异。例如:

Set a = 1 2 3 4;
Set b = 3 4 5 6;
Set c = a - b; // (1 2);

我应该如何重载运算符?我尝试使用 frienldy 函数,但它不能与变量“大小”一起使用。 Visual Studio 在第 28 行显示错误“c2597”(大小++;) 我不明白,如何重载“-”以将其与两组一起使用。当我重载类的方法时,我只能使用一个参数。当我使用友元函数时,我可以使用两个参数(设置 a,设置 b),但我不能使用变量“大小”。

#include <iostream>
#include <locale.h>
#include <conio.h>
#include <vector>
using namespace std;

class Set {
private:
    int size;
    vector <int> vect;  
public:
    Set() { size = 0; } 
    ~Set() { vect.clear(); } 
    void Enter(); 
    void Show(); 
    friend Set operator-(Set a, Set b)
    {
        size = 0;
        vect.clear();
        int i, j, n = 0;
        for (i = 0; i < a.size; i++) {
            int cnt = 0;
            for (j = 0; j < b.size; j++)
            {
                if (a.vect[i] == b.vect[j]) cnt++;
            }
            if (cnt == 0) {
                size++;
                vect.push_back(a.vect[i]);
            }

        }
        return a;
    }
    void add()
    {
        int element;
        cout << "Введите новый элемент " << endl;
        cin >> element;
        size = size + 1;
        vect.push_back(element);
    }
};

void Set::Enter() {
    cout << "Введите размер " << endl;
    cin >> size;
    vect.resize(size);
    cout << "Введите элементы :" << endl;
    for (int i = 0; i < size; i++)
    {
        cin >> vect[i];
    }
}

void Set::Show() {
    cout << "Множество: " << endl;
    for (int i = 0; i < size; i++)
        cout << vect[i] << " ";
    cout << endl;
}


int main() {
    setlocale(LC_ALL, "RUS");
    Set a;
    a.Enter();
    Set b;
    b.Enter();
    Set c;
    c = a - b;
    c.Show();
    c.add();
    c.Show();
    _getch();
    return 0;
}

更新: 我通过方法做到了:

Set operator-(const Set& b)
    {
        Set a = *this;
        Set tmp;
        tmp.size = 0;
        vect.clear();
        int i, j, n = 0;
        for (i = 0; i < a.size; i++) {
            int cnt = 0;
            for (j = 0; j < b.size; j++)
            {
                if (a.vect[i] == b.vect[j]) cnt++;
            }
            if (cnt == 0) {
                tmp.size++;
                tmp.vect.push_back(a.vect[i]);
            }

        }
        return tmp;
    }

【问题讨论】:

  • 那么你想要的是set difference
  • 仅供参考:SO: how to find the intersection of two std::set in C++? 我重载了 * 用于集合的交集,+ 用于集合的并集(只是为了好玩)。
  • 您还有一些其他问题,例如运算符函数不是成员函数,这意味着它没有定义vectsize 变量。而且你总是返回a而不修改它。
  • 请注意std::vector 已经有size()
  • 我试图返回一个,因为不明白,必须返回哪个方法))对不起我的英语)差异:{1,2,3} - {2,3,4} = { 1}

标签: c++ set operator-overloading


【解决方案1】:

friend 函数不是成员方法,因此您必须将(隐式)this 的用法删除/替换为size = 0,您可能会添加额外的对象:

friend Set operator-(Set a, Set b)

{
    Set res;

    for (int i = 0; i < a.size; i++) {
        int cnt = 0;
        for (int j = 0; j < b.size; j++)
        {
            if (a.vect[i] == b.vect[j]) cnt++;
        }
        if (cnt == 0) {
            res.size++;
            res.vect.push_back(a.vect[i]);
        }

    }
    return res;
}

【讨论】:

  • 我不知道,我一定是想象出来的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2011-06-07
  • 2010-11-20
相关资源
最近更新 更多