Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
#1

Перегрузка оператора + - C++

23.08.2013, 20:59. Просмотров 589. Ответов 18
Метки нет (Все метки)

Доброго времени суток. Есть программа, создающая связный список, который содержит числа по возрастанию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <iostream>
 
enum {kIsSmaller, kIsSame, kIsLarger};
 
int Compare(int & itsval,int & val)
{
    if (itsval > val)
    return kIsLarger;
    if (itsval < val)
    return kIsSmaller;
    else
    return kIsSame;
}
 
class Node;
class OrdNode;
class HeadNode;
class TailNode;
 
class Node
{
    public:
        Node() {}
        virtual ~Node() {};
        virtual Node* Insert(int* theValue) {};
        virtual void Show() {}
    private:
};
 
class OrdNode : public Node
{
    public:
        OrdNode(int* theValue, Node* next);
        virtual ~OrdNode() {delete myValue; delete myNext;}
        virtual Node* Insert(int*  theValue);
        virtual void Show() {std::cout << *myValue << std::endl; myNext -> Show();}
        operator int() {return int(*myValue);}
   private:
        int* myValue;
        Node* myNext; 
};
 
OrdNode::OrdNode(int* theValue, Node* next):
    myValue(theValue),
    myNext(next)
{
}
 
Node* OrdNode::Insert(int* theValue)
{
    int result = Compare(*myValue, *theValue);
    
    switch(result)
    {
        case kIsSame:
        case kIsLarger:
            {
                OrdNode* newnode = new OrdNode(theValue,this);
                return newnode;
            }
        case kIsSmaller:
            myNext = myNext->Insert(theValue);
            return this;
    } 
}
 
class TailNode : public Node
{
    public:
        TailNode() {}
        ~TailNode(){}
        virtual Node* Insert(int* theValue);
        virtual void Show() {};
    private:
};
 
Node* TailNode::Insert(int* theValue)
{
    OrdNode* newnode = new OrdNode(theValue, this);
    return newnode;
}
 
class HeadNode : public Node
{
    public:
        HeadNode();
        ~HeadNode();
        virtual Node* Insert(int* theValue);
        virtual void Show() {myNext -> Show();}
    private:
        Node* myNext;
};
 
HeadNode::HeadNode()
{
    myNext = new TailNode;
}
 
HeadNode::~HeadNode()
{
    delete myNext;
}
 
Node* HeadNode::Insert(int* theValue)
{
    myNext = myNext -> Insert(theValue);
    return this;
}
 
class LList
{
    public:
        LList();
        ~LList();
        LList(const LList & rhs); 
        void Insert(int* theValue);
        void ShowAll();
        //LList operator+(int*  rhs);
        HeadNode* myHead;
    private:
        HeadNode* GetHead() const {return myHead;}
        
};
 
LList::LList(const LList & rhs)
{
    myHead = new HeadNode;
    myHead = rhs.GetHead();
}
/*
LList LList::operator+(int*  rhs)
{
     Insert(rhs);     
     return *this;
}*/
 
LList::LList()
{
    myHead = new HeadNode;
}
 
LList::~LList()
{
    delete myHead;
    myHead = 0;
}
 
void LList::Insert(int* theValue)
{
    myHead -> Insert(theValue);
}
 
void LList::ShowAll()
{
    myHead->Show();    
}
 
int main()
{
    system("chcp 1251");
    system("cls");
    LList list;
    list = list + 1;
    list.ShowAll();
    system("pause");
    return 0;
}
OrdNode - класс для промежуточных узлов, содержащих данные. HeadNode и TailNoid - классы для головного и хвостового узлов. Класс LList - добавляет данные в список в процедуре Insert. Как перегрузить оператор сложения в классе LList, чтобы можно было добавлять числа в список операцией типа list = list + p, где p - указатель на переменную? С тем что есть сейчас (выделено комментариями) программа вылетает при запуске
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 20:59     Перегрузка оператора +
Посмотрите здесь:

Перегрузка оператора + - C++
Всем привет, проблема на этот раз такая. Для того, чтобы выучить классы, я пишу некое подобие класса string. Сложность вот в чем. Возникла...

Перегрузка оператора [] - C++
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public: struct Node { Element el; ...

Перегрузка оператора = - C++
Доброго времени суток,не могу понять в чем проблема. Есть класс,в котором переопределен оператор +, есть массив классов, при попытке...

Перегрузка оператора << - C++
Здравствуйте! Подскажите, пожалуйста, как выполнить перегрузку оператора &lt;&lt;? Для двух классов: class A { public:

перегрузка оператора [] - C++
объясните в 3х словах для ламера в чем смысл перегрузки, конкретно оператора

Перегрузка оператора - C++
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой строке: postfix ‘const Counter...

Перегрузка оператора [][] - C++
добрый день. имею в классе двумерный массив. подскажите как правильно сделать перегрузку к классу, чтоб при ЭкземлплярКлассa...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
23.08.2013, 21:21     Перегрузка оператора + #2
Все ссылает на уровень ниже, но в конце это
C++
1
virtual Node* Insert(int* theValue) {};
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Node* OrdNode::Insert(int* theValue)
{
    int result = Compare(*myValue, *theValue);
    
    switch(result)
    {
        case kIsSame:
        case kIsLarger:
            {
                OrdNode* newnode = new OrdNode(theValue,this);
                return newnode;
            }
        case kIsSmaller:
            myNext = myNext->Insert(theValue);
            return this;
    } 
}
скорее всего тут break'и забыл, и если так
C++
1
2
case kIsSame:
        case kIsLarger:
используешь, то проще юзать bool для меньше или равно и больше
qwe12355
7 / 7 / 0
Регистрация: 26.11.2011
Сообщений: 117
23.08.2013, 22:09     Перегрузка оператора + #3
что-то такое нельзя?

C++
1
2
3
4
5
LList LList::operator+(int i)
{
    LList::Insert(&i);
    return *this;
}
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 22:38  [ТС]     Перегрузка оператора + #4
То же самое
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
23.08.2013, 22:58     Перегрузка оператора + #5
Ты хочешь сделать связный список?
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 23:08  [ТС]     Перегрузка оператора + #6
Да, и я его сделал. Без оператора + (просто Insert(int)) он работает. Но все же хочется понять, что не так
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.08.2013, 23:30     Перегрузка оператора + #7
Цитата Сообщение от lanmitSM Посмотреть сообщение
Но все же хочется понять, что не так
operator+ по смыслу не должен модифицировать this.
Если хотите сделать добавление элемента таким образом, то создавайте внутри новый list, добавляйте в него элемент и возвращайте свежесозданный list.
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 10:15  [ТС]     Перегрузка оператора + #8
Спасибо. А каких еще операторов касается это правило?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 10:33     Перегрузка оператора + #9
Цитата Сообщение от lanmitSM Посмотреть сообщение
А каких еще операторов касается это правило?
Всех операторов, которые должны возвращать временный объект, например всех бинарных операторов.
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 11:28  [ТС]     Перегрузка оператора + #10
C++
1
2
3
4
5
6
7
LList LList::operator+(int* rhs)
{
     LList temp;
     temp.myHead = this->myHead;
     temp.Insert(rhs);
     return temp;
}
написал так - ошибка никуда не делась
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 11:38     Перегрузка оператора + #11
Так должно работать.
C++
1
2
3
4
5
6
LList LList::operator + ( const int * rhs )
{
     LList temp = *this;
     temp.Insert(rhs);
     return temp;
}
Я не заметил.., а где ты привел ошибку которая "никуда не делась" ?
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 11:50  [ТС]     Перегрузка оператора + #12
на строке list = list + p выводит "Прекращена работа программы..." То есть она компилируется, запускается и до этого работает нормально (если написать просто list.Insert(int))
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 11:52     Перегрузка оператора + #13
Покажи исправленный код целиком.
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 11:57  [ТС]     Перегрузка оператора + #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <iostream>
 
//enum ddd {kIsSmaller, kIsSame, kIsLarger};
 
bool Compare(const int & itsval,const int & val)
{
    if (itsval > val)
    return false;
    if (itsval < val)
    return true;
    else
    return false;
}
 
class Node;
class OrdNode;
class HeadNode;
class TailNode;
 
class Node
{
    public:
        Node() {}
        virtual ~Node() {};
        virtual Node* Insert(const int* theValue) = 0;
        virtual void Show() = 0;
    private:
};
 
class OrdNode : public Node
{
    public:
        OrdNode(const int* theValue, Node* next);
        virtual~OrdNode() {delete myValue; delete myNext;}
        virtual Node* Insert(const int*  theValue);
        virtual void Show() {std::cout << *myValue << std::endl; myNext -> Show();}
   private:
        const int* myValue;
        Node* myNext; 
};
 
OrdNode::OrdNode(const int* theValue, Node* next):
    myValue(theValue),
    myNext(next)
{
}
 
Node* OrdNode::Insert(const int* theValue)
{
    bool result = Compare(*myValue, *theValue);
    if (!result)
    {
        OrdNode* newnode = new OrdNode(theValue,this);
        return newnode;
    }
    else
    {
        myNext = myNext->Insert(theValue);
        return this;
    }
    return this; 
}
 
class TailNode : public Node
{
    public:
        TailNode() {}
        ~TailNode(){}
        virtual Node* Insert(const int* theValue);
        virtual void Show() {};
    private:
};
 
Node* TailNode::Insert(const int* theValue)
{
    OrdNode* newnode = new OrdNode(theValue, this);
    return newnode;
}
 
class HeadNode : public Node
{
    public:
        HeadNode();
        ~HeadNode();
        virtual Node* Insert(const int* theValue);
        virtual void Show() {myNext -> Show();}
    private:
        Node* myNext;
};
 
HeadNode::HeadNode()
{
    myNext = new TailNode;
}
 
HeadNode::~HeadNode()
{
    delete myNext;
}
 
Node* HeadNode::Insert(const int* theValue)
{
    myNext = myNext->Insert(theValue);
    return this;
}
 
class LList
{
    public:
        LList();
        ~LList();
        LList(const LList &  rhs);
        void Insert(const int* theValue);
        void ShowAll();
        LList operator+(const int* rhs);
    private:
        HeadNode* myHead;
};
 
LList::LList(const LList & rhs)
{
    myHead = rhs.myHead;
}
 
LList LList::operator+(const int* rhs)
{
     LList temp = *this;
     temp.Insert(rhs);
     return temp;
}
 
LList::LList()
{
    myHead = new HeadNode;
}
 
LList::~LList()
{
    delete myHead;
}
 
void LList::Insert(const int* theValue)
{
    myHead -> Insert(theValue);
}
 
void LList::ShowAll()
{
    myHead->Show();    
}
 
int main()
{
    system("chcp 1251");
    system("cls");
    LList ll;
    int * pData;
    int val;
    /*for (;;)
    {
        std::cout << "What value? (0 to stop): ";
        std::cin >> val;
        if (!val)
        {
            break;
        }
        pData = new int;
        *pData = val;
        ll.Insert(pData);
    }*/
    pData = new int;
    *pData = 0;
    ll = ll + pData;
    ll.ShowAll();
    system("pause");
    return 0;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 12:18     Перегрузка оператора + #15
Это все из-за деструктора. Он удаляет список при выходе из оператора +. Я бы тебе все же посоветовал перегрузить оператор +=, т.к. это будет правильней.
C++
1
2
3
4
5
LList & LList::operator += ( const int * rhs )
{
     Insert( rhs );
     return *this;
}
C++
1
2
3
    ...
    ll += pData;
    ...
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 12:34  [ТС]     Перегрузка оператора + #16
Теперь работает. А если из деструктора LList'a убрать строку, delete myHead, заработает оператор +?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 12:37     Перегрузка оператора + #17
Цитата Сообщение от lanmitSM Посмотреть сообщение
Теперь работает. А если из деструктора LList'a убрать строку, delete myHead, заработает оператор +?
Да. Только появится утечка памяти.
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 12:38  [ТС]     Перегрузка оператора + #18
Спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 20:26     Перегрузка оператора +
Еще ссылки по теме:

Перегрузка оператора - C++
Здравствуйте! Помогите разобраться с перегрузкой операторов. Суть задания: Осуществите перегрузку оператора “++” так, чтобы при его...

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора = - C++
Здравствуйте, возникла проблема при перегрузке оператора. const digit &amp;operator=( const int &amp; ); const digit &amp;operator=( const char...

Перегрузка оператора -> - C++
обясните пожалуйста как перегружать -&gt; и для чего это нужно

Перегрузка оператора << - C++
Вот упрощенный вариант моей программы, пересчитывает время в 12-й формат мне нужно перегрузить оператор &lt;&lt; так, чтобы time_cycle_1&lt;&lt;(1);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
24.08.2013, 20:26     Перегрузка оператора + #19
а разве эта структура вообще правильна? как-то много классов, не достаточно разве просто создать указатель start, next,tail?
Yandex
Объявления
24.08.2013, 20:26     Перегрузка оператора +
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru