0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Есть программа, создающая связный список, который содержит числа по возрастанию
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 - указатель на переменную? С тем что есть сейчас (выделено комментариями) программа вылетает при запуске
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2013, 20:59
Ответы с готовыми решениями:

Перегрузка оператора
#include &lt;iostream&gt; class Node { public: char *s; int length; Node * next; public:...

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

Перегрузка оператора ==
Я уже встречала подобный вопрос на этом форуме, но у меня всё равно что-то не получается Вот...

Перегрузка оператора[]
Пример взят из книги Лафоре, тема перегрузка операций. Выдает ошибки: 1.Требуется идентификатор....

18
25 / 25 / 11
Регистрация: 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 для меньше или равно и больше
0
7 / 7 / 1
Регистрация: 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;
}
0
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 22:38  [ТС] 4
То же самое
0
25 / 25 / 11
Регистрация: 02.01.2012
Сообщений: 371
23.08.2013, 22:58 5
Ты хочешь сделать связный список?
0
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 23:08  [ТС] 6
Да, и я его сделал. Без оператора + (просто Insert(int)) он работает. Но все же хочется понять, что не так
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.08.2013, 23:30 7
Цитата Сообщение от lanmitSM Посмотреть сообщение
Но все же хочется понять, что не так
operator+ по смыслу не должен модифицировать this.
Если хотите сделать добавление элемента таким образом, то создавайте внутри новый list, добавляйте в него элемент и возвращайте свежесозданный list.
1
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 10:15  [ТС] 8
Спасибо. А каких еще операторов касается это правило?
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
24.08.2013, 10:33 9
Цитата Сообщение от lanmitSM Посмотреть сообщение
А каких еще операторов касается это правило?
Всех операторов, которые должны возвращать временный объект, например всех бинарных операторов.
0
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;
}
написал так - ошибка никуда не делась
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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;
}
Я не заметил.., а где ты привел ошибку которая "никуда не делась" ?
0
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 11:50  [ТС] 12
на строке list = list + p выводит "Прекращена работа программы..." То есть она компилируется, запускается и до этого работает нормально (если написать просто list.Insert(int))
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
24.08.2013, 11:52 13
Покажи исправленный код целиком.
0
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;
}
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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;
    ...
1
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 12:34  [ТС] 16
Теперь работает. А если из деструктора LList'a убрать строку, delete myHead, заработает оператор +?
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
24.08.2013, 12:37 17
Цитата Сообщение от lanmitSM Посмотреть сообщение
Теперь работает. А если из деструктора LList'a убрать строку, delete myHead, заработает оператор +?
Да. Только появится утечка памяти.
0
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 12:38  [ТС] 18
Спасибо
0
25 / 25 / 11
Регистрация: 02.01.2012
Сообщений: 371
24.08.2013, 20:26 19
а разве эта структура вообще правильна? как-то много классов, не достаточно разве просто создать указатель start, next,tail?
0
24.08.2013, 20:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2013, 20:26
Помогаю со студенческими работами здесь

Перегрузка оператора ++
Что делает оператор ++ при его перегрузке?

Перегрузка оператора
Помогите доделать задание... Это в классе метод, осуществляющий ввод значений полей класса с...

Перегрузка оператора +=
У меня имеется структура и метод, который вызывается след образом: A.plus_and_minus(B); Есть...

Перегрузка оператора '='
Не давно стал изучать С++ и дошёл до перегрузок операторов, и с книги написал пример, и не могу в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru