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

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

Восстановить пароль Регистрация
 
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 20:59     Перегрузка оператора + #1
Доброго времени суток. Есть программа, создающая связный список, который содержит числа по возрастанию
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++ Перегрузка оператора +=
Перегрузка оператора = C++
Перегрузка оператора * C++
Перегрузка оператора ~ C++
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,020
Записей в блоге: 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
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,020
Записей в блоге: 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
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,020
Записей в блоге: 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
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,020
Записей в блоге: 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
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,020
Записей в блоге: 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++ Перегрузка оператора <<
Перегрузка оператора + C++

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

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

Текущее время: 17:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru