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

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

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

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

23.08.2013, 20:59. Просмотров 601. Ответов 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 - указатель на переменную? С тем что есть сейчас (выделено комментариями) программа вылетает при запуске
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 20:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора + (C++):

Перегрузка оператора + - C++
Осуществляю перегрузку оператора +. и вот почему-то член класса s меняет свою длину с 4 до 7 и мне вот это не понятно.. Подскажите,...

Перегрузка оператора = - C++
Ввести строку символов S1. Программа должна содержать перегруженную операцию “=”, использование которой скопирует S1 в S2 при следующих...

Перегрузка оператора [] - C++
Создал класс в котором массив указателей на другой класс, перегрузил оператор взятия индекса следующим образом: h-файл #ifndef...

Перегрузка оператора - - C++
В своём классе я перегрузил оператор -,но в функции,использующей вычитание возникает ошибка error C2678: бинарный &quot;-&quot;: не найден...

Перегрузка оператора += - C++
реализую класс собственных строк называеться MyString вылетает при использовании оператора += самое интересное что если дебажишь код по...

Перегрузка оператора () - C++
кто может подсказать как создать перегрузку что бы можно было работать с амссивввом в таком ввиде mass(3)=2 а не mass=2; если можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 для меньше или равно и больше
0
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;
}
0
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 22:38  [ТС] #4
То же самое
0
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
23.08.2013, 22:58 #5
Ты хочешь сделать связный список?
0
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
23.08.2013, 23:08  [ТС] #6
Да, и я его сделал. Без оператора + (просто Insert(int)) он работает. Но все же хочется понять, что не так
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.08.2013, 23:30 #7
Цитата Сообщение от lanmitSM Посмотреть сообщение
Но все же хочется понять, что не так
operator+ по смыслу не должен модифицировать this.
Если хотите сделать добавление элемента таким образом, то создавайте внутри новый list, добавляйте в него элемент и возвращайте свежесозданный list.
1
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 10:15  [ТС] #8
Спасибо. А каких еще операторов касается это правило?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 10:33 #9
Цитата Сообщение от lanmitSM Посмотреть сообщение
А каких еще операторов касается это правило?
Всех операторов, которые должны возвращать временный объект, например всех бинарных операторов.
0
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;
}
написал так - ошибка никуда не делась
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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;
}
Я не заметил.., а где ты привел ошибку которая "никуда не делась" ?
0
lanmitSM
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
24.08.2013, 11:50  [ТС] #12
на строке list = list + p выводит "Прекращена работа программы..." То есть она компилируется, запускается и до этого работает нормально (если написать просто list.Insert(int))
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 11:52 #13
Покажи исправленный код целиком.
0
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;
}
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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;
    ...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 12:18
Привет! Вот еще темы с ответами:

Перегрузка оператора + - C++
Не могу заставить работать перегруженный оператор + в функции CMoveByVector Point.h: #define POINT_H #include &lt;iostream&gt; ...

Перегрузка оператора << - C++
Есть такой код. class matrix { public: ......; const double* operator(int) const; double* const operator(int); friend...

Перегрузка оператора << - C++
Здравствуйте форумчане, помогите исправить ошибку. Вообщем есть класс с перегруженным оператором &lt;&lt; . Category.h class...

Перегрузка оператора = - C++
Нужно перегрузить оператор так что бы в начале строки и в конце были квадратные скобки . Все почти работает только вот вывод на экран не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.08.2013, 12:18
Ответ Создать тему
Опции темы

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