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

почему нельзя в операторе + возвращать оригинальное значение(по ссылке), а не копию. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Путник двигался t1 часов со скоростью v1, затем t2 часов- со скоростью v2 и t3 часов со скоростью v3. За какое время он одолел первую половину пути http://www.cyberforum.ru/cpp-beginners/thread954534.html
Путник двигался t1 часов со скоростью v1, затем t2 часов- со скоростью v2 и t3 часов со скоростью v3. За какое время он одолел первую половину пути.
C++ Составить программу по предложенному условию: "Можно ехать со скоростью Составить программу по предложенному условию: "Можно ехать со скоростью v1 км/ч и оплатой р1 руб./км либо идти пешком со скоростью v2 км/ч бесплатно. Как с наименьшими затратами преодолеть путь S за t мин. если это возможно? Какие будут затраты? http://www.cyberforum.ru/cpp-beginners/thread954532.html
C++ Двунаправленный линейный список
Нужно сделать из двунаправленного линейного списка, циклический и найти ср. аримфетическое. Мои попытки сделать двунаправленный циклический список не увенчались успехом. #include<stdio.h> #include<stdlib.h> #include<math.h> const int n=5;//кол-во элементов struct List//структура {int data; List *next,*prev;};
Почему программа компилится, хотя компилиться не должна? C++
#include <windows.h> #include <stdio.h> using namespace std; class foo { public: foo () {} };
C++ Не понятно с const_cast http://www.cyberforum.ru/cpp-beginners/thread954520.html
Адрес один и тот же, а значения разные, как так? #include <iostream> int main() { const double pi = 3.14159265; double* ip; ip = const_cast<double*>(&pi); std::cout << ip << " " << *ip << std::endl;
C++ Отключения/включения alt+enter Привет, как программно отключить и включить виндовской хот-кей alt+enter ? подробнее

Показать сообщение отдельно
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
14.09.2013, 20:58     почему нельзя в операторе + возвращать оригинальное значение(по ссылке), а не копию.
Второй час сижу над одним и тем же кодом и не могу понять, что не так. Не могу сообразить почему нельзя в операторе + возвращать оригинальное значение(по ссылке), а не копию.

Вот шаблон класса "множество":
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#ifndef SET_H
#define SET_H
 
#include <iostream>
#include <cstdlib>
 
using std::ostream;
using std::istream;
using std::endl;
using std::cerr;
using std::exit;
 
using std::cout;
 
template <typename T> class Set;
template <typename T> ostream& operator<<(ostream&, const Set<T>&);
template <typename T> istream& operator>>(istream&, Set<T>&);
 
template <typename T>
class Set
{ 
    friend ostream& operator<< <> (ostream&, const Set<T>&);
    friend istream& operator>> <> (istream&, Set<T>&);
    
    public:
        explicit Set();
        Set(const T*, int);
        
        Set(const Set&);
        ~Set();
        const Set& operator=(const Set&);
        
        int get_power() const;
        
        bool operator==(const Set&) const;
        bool operator!=(const Set&) const;
        
        const Set<T>& operator+(const Set&);
        //const Set operator^(const Set&);
        //const Set operator/(const Set&);
        
        T& operator[](int);
        T operator[](int) const;
        
    private:
        int power;
        T *begin;
};
 
template <typename T>
ostream& operator<<(ostream& output, const Set<T> &a)
{
    output << "Power: " << a.power << "; ";
    output << "Elements: ";
    for(int i=0; i<a.power; i++)
        output << a.begin[i] << " ";
    
    output << endl;
    
    return output;
}
 
template <typename T>
istream& operator>>(istream& input, Set<T> &a)
{
    int pow;
    input >> pow;
    
    a.power=(pow<0)?0:pow;
    delete [] a.begin;
    a.begin = new T[a.power];
    
    for(int i=0; i<a.power; i++)
        input >> a.begin[i];
    
    return input;
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
Set<T>::Set()
{
    power=0;
    begin=new T[power];
}
 
template <typename T>
Set<T>::Set(const T* array, int n)
{
    power=(n<0)?0:n;
 
    begin=new T[power];
    
    for(int i=0; i<power; i++)
        begin[i]=array[i];
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
Set<T>::Set(const Set &Set_to_copy)
{
    power=Set_to_copy.power;
    begin=new T[power];
    
    for(int i=0; i<power; i++)
        begin[i]=Set_to_copy.begin[i];
}
 
template <typename T>
Set<T>::~Set()
{
    delete []begin;
}
 
template <typename T>
const Set<T>& Set<T>::operator=(const Set &right)
{
    if( &right!=this )
    {
        delete []begin;
        power=right.power;
        begin=new T[power];
        
        for(int i=0; i<power; i++)
            begin[i]=right.begin[i];
    }
    
    return *this;
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
int Set<T>::get_power() const
{
    return power;
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
bool Set<T>::operator==(const Set &right) const
{
    if(power!=right.power) return false;
    
    for(int i=0; i<power; i++)
        if(begin[i]!=right.begin[i]) return false;
    
    return true;
}
 
template <typename T>
bool Set<T>::operator!=(const Set &right) const
{
    return !(*this==right);
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
const Set<T>& Set<T>::operator+(const Set<T> &right) 
{
    int pow = right.power + power;
 
    Set<T> result;
    result.power=(pow<0)?0:pow;
    delete [] result.begin;
    result.begin= new T(result.power);
    
    
    for(int i=0; i<power; i++) result.begin[i]=begin[i];
    for(int i=power; i<result.power; i++) result.begin[i]=right.begin[i-power];
    
    return result;
}
 
////////////////////////////////////////////////////////////////////////////////
        
template <typename T>
T& Set<T>::operator[](int index)
{
    if(index<0 || index>=power)
    {
        cerr << "\nError: index " << index << " out of range" << endl;
        exit(666);
    }
    
    return begin[index];
}
 
template <typename T>
T Set<T>::operator[](int index) const
{
    if(index<0 || index>=power)
    {
        cerr << "\nError: index " << index << " out of range" << endl;
        exit(666);
    }
    
    return begin[index];
}
 
////////////////////////////////////////////////////////////////////////////////
 
#endif
Вот main:
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
#include <iostream>
#include <cstdlib>
#include "set.h"
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    int array2[10]={15, 14, 13, 12, 11, 10, 9, 8, 7, 6};
    
    Set <int> intSet1(array2, 5);
    Set <int> intSet2(array2, 10);
    
    cout << intSet1 << endl << endl; 
    cout << intSet2 << endl << endl;
        
    cout << (intSet1+intSet2);
    
    cout << endl;
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru