Неправильно вычисляется проверка на подмножество, при вызове метода get вместо символов получаются знаки равно

Неправильно вычисляется проверка на подмножество, при вызове метода get вместо символов получаются знаки равно. Как это исправить?

Написал класс Set - множество, добавил в него перегрузку операции проверки на подмножество >, но она не работает как нужно, при вызове метода get в ней получаются знаки равно.

введите сюда описание изображения

Программный код:

Main.cpp:

#include <iostream>
#include "Set.h"
using namespace std;

int main()
{
    Set set;
    set + 'a';
    set + 'b';

    Set set_2;
    set_2 + 'k';
    set_2 + 'b';

    set.print(); // содержимое set
    set_2.print(); // содержимое set_2

    cout << set.get(1) << endl; // получение элемента по индексу

    (set > set_2).print(); // пересечение множеств 

}

Set.h:

#pragma once
#include <iostream>
#define maxlength 10
using namespace std;

class Set {
    char* s; // указатель на начало массива
    int power = 0; // текущий размер массива
public:
    Set();
    Set(int POWER);
    Set(const Set& cs);
    ~Set();
    char get(int i);
    int length();
    int index(char ch);
    void print();
    Set& operator=(Set& v);
    void operator +(char a); // добавить элемент в множество
    friend Set operator>(Set sf, Set ss); // проверка на подмножество
    Set operator -(char a);
};

Set.cpp:

#include "Set.h"

Set::Set()
{
    s = new char[maxlength];
    power = 0;
}

Set::Set(int POWER)
{
    s = new char[maxlength];
    power = POWER;

}

Set::Set(const Set& cs)
{
    s = new char[maxlength];
    power = cs.power;
    for (int i = 0; i < power; i++)
        s[i] = get(i);
}

Set::~Set()
{
    delete[] s;
}

char Set::get(int i)
{
    return s[i];
}

int Set::length()
{
    return power;
}

int Set::index(char ch)
{
    for (int i = 0; i < power; i++) {
        if (ch == s[i]) {
            return i;
        }
            
    }
        
}

void Set::print()
{
    for (int i = 0; i < power; i++)
        cout << s[i] << ' ';
    cout << "" << endl;
}

Set& Set::operator=(Set& v)
{
    if (this != &v)
    {
        power = v.power;
        delete[] s;
        s = new char[maxlength];
        for (int i = 0; i < v.power; ++i)
        {
            s[i] = v.s[i];
        }
    }
    return *this;
}

void Set::operator+(char a)
{
        if (power < maxlength) {
            s[power] = a; 
            power++;
        }
        
}

Set Set::operator-(char a)
{
    Set set;
    char ch;
    for (int i = 0; i < power; i++) {
        ch = this->get(i);
        if (a != ch) {
            set + ch;
        }       
    }   
    return set;
}

Set operator>(Set sf, Set ss)
{
    int i, j;
    Set tmp;
    for (i = 0; i < sf.power; i++)
        for (j = 0; j < ss.power; j++)
            if (sf.get(i) == ss.get(j))
                tmp + ss.get(j);
    return tmp;
}

Ответы (1 шт):

Автор решения: Harry

У вас передача в оператор > по значению, так что посмотрим на конструктор копирования внимательнее...

Set::Set(Set& cs)    // Конечно, лучше бы передавать по константной ссылке - вряд ли вы 
                     // собираетесь менять копируемое множество... ну да ладно
{
    s = new char[maxlength];   // Отлично, выделена память
    power = cs.length();       // Размер равен копируемому
    for (int i = 0; i < power; i++)
        s[i] = get(i);         // Поскольку get(i) по сути и есть s[i], копируем... 
                               // выделенный массив с мусором сам в себя (!)
}

Все, вопросов больше нет?

А у меня есть - что вам стоило, получив проблему, начать с того, что добавить в проблемный код отладочный вывод

Set operator>(Set sf, Set ss)
{
    sf.print();
    ss.print();
    int i, j;
    Set tmp;
    for (i = 0; i < sf.power; i++)

и сразу увидеть, что множества в операторе совсем не те, что вы передаете? Как вы вообще пытались справиться с проблемой? Как отлаживали код?

→ Ссылка