Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2010, 21:16   #1
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию Конструктор копирования, перегрузка операций

Доброго времени суток!Используя связный список, пытаюсь реализовать класс множеств. B=A|C; не работает корректно. Так и не смог понять, где напортачил(надеюсь, что код читаем). Заранее спасибо!
Код:
#ifndef BASE_SET_H
#define BASE_SET_H
#include <iostream>
using namespace std;
class base_set
{
    friend class set;
public:
    base_set(int inf){next_ptr = 0; data = inf;}
    int get_data() const{return data;}
    base_set* get_next() const{return next_ptr;}
private:
    int data;
    base_set *next_ptr;
};

class set
{
friend ostream& operator<<(ostream &output, set &value);
friend istream& operator>>(istream &input, set &value);
public:
    set(){first_ptr = last_ptr = 0;}
    set(const set & right);
    void clear();//очистка списка
    ~set(){clear();}
    bool isEmpty() const{return first_ptr == 0;}
    base_set *inSet(int val) const;//принадлежит ли число множеству
    set &operator+(int value);//добавление элемента
    set &operator-(int value);//удаление элемента
    set &operator=(const set& right);
    set &operator| (const set & right) const;//объединение множеств
private:
    base_set *get_new_ptr(int val)
{base_set *ptr = new base_set (val); return ptr;}
    base_set *first_ptr, *last_ptr;
};
ostream& operator<<(ostream &output, set &value);
istream& operator>>(istream &input, set &value);
#endif
Код:
#include "base_set.h"
void set::clear()
{
    if (!isEmpty())
        {
            base_set *cur_ptr = first_ptr, *temp_ptr;
            while (cur_ptr != 0)
            {
                temp_ptr = cur_ptr;
                cur_ptr = cur_ptr->next_ptr;
                delete temp_ptr;
            }
        }
}

set::set(const set & right)
{
    base_set *cur_ptr = right.first_ptr;
    while (cur_ptr!= 0)
    {
        *this + (cur_ptr->data);
        cur_ptr = cur_ptr->next_ptr;
    }

}
set& set::operator+( int value)
{
    base_set *new_ptr =get_new_ptr(value);
    if (isEmpty())
        first_ptr =last_ptr = new_ptr;
    else if (!inSet(value))
    {
        last_ptr->next_ptr = new_ptr;
        last_ptr = new_ptr;
    }
    return *this;
}

ostream& operator<<(ostream &output, set &value)
{
    output <<"{ " ;
    if (!(value.isEmpty()))
    {
        base_set *current_ptr = value.first_ptr;
        while (current_ptr != value.last_ptr)
        {
            output << (current_ptr->get_data()) << ", ";
            current_ptr = current_ptr->get_next();
        }
        output << (value.last_ptr->get_data());

    }
    output <<" }" ;
    return output;
}

istream& operator>>(istream &input, set &value)
{
    int temp_var;
        while (input >> temp_var)
            value + temp_var;
    return input;
}

base_set *set::inSet(int val) const
{
    if (!isEmpty())
    {
        base_set *cur_ptr = first_ptr;
        while (cur_ptr!=0)
        {
            if (cur_ptr->data== val )
                return cur_ptr;
            cur_ptr = cur_ptr->next_ptr;
        }
    }
    return 0;
}

set &set::operator-(int value)
{
    if (!isEmpty())
    {
        base_set *temp_ptr;
        if (temp_ptr = inSet(value))
        {
            base_set *cur_ptr = first_ptr;
            if (last_ptr == first_ptr)
                last_ptr = first_ptr = 0;
                else if  (temp_ptr == first_ptr)
                    first_ptr = temp_ptr->next_ptr;
                    else
                    {
                        while (cur_ptr->next_ptr != temp_ptr)
                            cur_ptr = cur_ptr->next_ptr;
                        if (cur_ptr ->next_ptr == last_ptr)
                        {
                            last_ptr =cur_ptr;
                            last_ptr->next_ptr = 0;
                        }
                        else
                            cur_ptr->next_ptr = (cur_ptr->next_ptr)->next_ptr;
                    }
        delete temp_ptr;
        }
    }
    return *this;
}

set &set::operator=(const set& right)
{
    if (&right != this)
    {
        clear(); base_set *cur_ptr=right.first_ptr;
        while (cur_ptr!=0)
        {
            this->operator+(cur_ptr->data);
            cur_ptr = cur_ptr->next_ptr;
        }
    }
    return *this;
}

set &set::operator| (const set & right) const
//тут я как только не извращался...
{
     if ((&right != this) && (!right.isEmpty()))
    {
        set temp =*this;
        cout << temp;
        base_set *cur_ptr = right.first_ptr;
        while (cur_ptr!=0)
        {
            temp.operator+(cur_ptr->data);
            cur_ptr = cur_ptr->next_ptr;
        }
        return temp;
    }
   return *this;
}
Код:
#include "base_set.h"
using namespace std;
int main() 
{set A, B, C;cin >> A; (С = B = A) +7;
    cout << A << B << C << endl; B = A|C;
    cout <<endl <<A - 3 + 5 << endl << B ;return 0;}

Последний раз редактировалось xPAL; 15.10.2010 в 12:25. Причина: грамматика
xPAL вне форума Ответить с цитированием
Старый 15.10.2010, 20:16   #2
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию

Нашел ошибки: в функции clear, operator| Тему можно закрывать.
xPAL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка операций nastya081108 Помощь студентам 0 18.05.2010 21:16
Перегрузка стандартных операций Новичек_Rudik Помощь студентам 1 19.04.2010 23:32
перегрузка операций в си++ Serjuk Общие вопросы C/C++ 9 20.03.2010 21:30
Конструктор, наследование, перегрузка операций Lioness Помощь студентам 18 02.06.2008 20:44