Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 01.10.2014
Сообщений: 87
1

Неправильная работа оператора присваивания после работы оператора суммирования

27.02.2016, 17:43. Просмотров 538. Ответов 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
class TVector {//ewde
    public:
        TVector();
        //Vector(Vector &v);
        TVector(int size);
        ~TVector();
        TVector(TVector &v); //конструктор копирования
 
        void push_back(int n);//положить в крнец вектора
        void pop_back();//из конца убрать элемент, тем самым уменьшив размер
        void resize(int cap);//изменить вместимость (capacity)
        int Size();//вернуть размер
        int last();//вернуть последний элемент
        int Capacity();
        void Delete();
        bool Empty();
        int &operator[](int i);
 
        void push(int i, int x);
        void repair();
        TVector &operator=(TVector &v2);
        
        friend bool operator == (TVector &v, TVector &v2);
        friend bool operator <(TVector &v, TVector &v2);
        friend bool operator >(TVector &v, TVector &v2);
 
        friend void division2(TVector v, int divider, TVector *res); //деление на число, меньшее системы счисления
        friend TVector &operator + (TVector &v, TVector &v2);
        friend TVector &operator - (TVector &v, TVector &v2);
        friend TVector &operator * (TVector &v, int num);
        friend TVector &operator * (TVector &v, TVector &v2);
        friend TVector &operator / (TVector &v, TVector &v2);
        friend TVector &operator ^ (TVector &v, int num);
 
        friend std::ostream& operator<<(std::ostream& os, TVector& v);
        
        TVector *reverse(); //реверс вектора
 
        int size;
 
    private:
        int *numbers;
        int capacity;
        
    };
Вот реализация конструкторов и операторов:
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
TVector::TVector() {
    numbers = new int[8](); 
    //numbers = 0;
    size = 0;
    capacity = 8;
    //std::cout << numbers[1]
    std::cout << "I am alive!" << std::endl;
}
 
TVector::TVector(int newsize) {
    try {
        numbers = new int[newsize]();
    }
    catch (std::bad_alloc &e) {
        std::cerr << "Bad alloc caught:" << e.what() << std::endl;
        std::exit(0);
    }
    size = 0;
    capacity = newsize;
    
}
 
TVector::~TVector() {
    //std::cout << "I am die!" << std::endl;
    delete[]numbers;
    //std::cout << "Here." << std::endl;
    size = 0;
    capacity = 0;
}
 
TVector::TVector(TVector &v) :size(v.size),capacity(v.capacity){
    std::cout << "cpy constructor cap = " <<capacity<< std::endl;
    
    try { numbers = new int[v.Capacity()](); }
    catch (std::bad_alloc &e) {
        std::cerr << "Bad alloc: " << e.what() << std::endl;
    }
    for (int i = 0; i < v.Size(); i++) {
        numbers[i] = v.numbers[i];
    }
}
 
TVector &operator + (TVector &v, TVector &v2) {
    int k = 0;
    int i;
    int tmp;
    int x, y;
    TVector res(max(v.Size(), v2.Size()) + 1);
    std::cout << "cap=" << res.Capacity() << std::endl;
    for (i = 0; i < max(v.Size(),v2.Size()); i++) {
        x = (i < v.Size() ? v[i] : 0);
        y = (i < v2.Size() ? v2[i] : 0);
        k = (x + y + k) / b;
        //std::cout << "numbers[" << i << "]=" << numbers[i] << " v2=" << v2[i] << " item="<<
        res.push_back((x + y + k) % b);
        
        //std::cout << "ost=" << (v[i] + v2[i] + k) % b << "div=" << (v[i] + v2[i] + k) / b << std::endl;
    }
    if (k != 0)
        res.push_back(k);
    std::cout << "Cap=" << res.Capacity() << std::endl;
    return res;
}
 
TVector& TVector::operator=(TVector &v2) {
    if (&v2 != this) {      
        try {
            std::cout << "!!!capacity = " << v2.Capacity() << std::endl; //capacity у правого вектора почему-то не инициализировано 
            delete[] numbers;
            size = v2.Size();
            capacity = v2.capacity;
            numbers = new int[capacity](); 
            for (int i = 0; i < size; i++)
                numbers[i] = v2.numbers[i];     
        }
        catch (std::bad_alloc &e) {
            std::cerr << "Bad alloc caught:" << e.what()<<std::endl;
            std::exit(0);
        }
    }
    return *this;
}
Допустим, в main-е есть 2 вектора и их сумма я помещаю в вектор res:
C++
1
2
TVector res();
res = v + v2;
Просуммировались векторы нормально, однако на этапе срабатывания оператора присваивания срабатывает исключения из-за отрицательного огромного значения capacity по причине отсутствия его инициализации (строчка 72).
Подскажите пожалуйста, что нужно изменить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2016, 17:43
Ответы с готовыми решениями:

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В...

Если a=true и x=1, то какое значение получит логическая переменная d после выполнения оператора присваивания
а) d:=x&lt;2; б)d:=not a or odd(x); в)d:=odd(a)&lt;&gt;x Вычислить значение логических выражений 1) t...

Посмотрите описание конструктора копирования и оператора присваивания с ними все в порядке? После функции add теряются данные
class Person{ char *name; int age; char *floor; char *phone; public: Person(){...

Перегрузка оператора присваивания
Вот есть такой класс template&lt;typename TT&gt; class Matrix { public:...

1
nd2
3371 / 2763 / 1240
Регистрация: 29.01.2016
Сообщений: 9,364
27.02.2016, 19:58 2
Компилятор разве не предупреждает, что из operator+ возвращается ссылка на локальный объект?
Цитата Сообщение от mishula Посмотреть сообщение
что нужно изменить.
Делай возврат по значению.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2016, 19:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Проверка оператора присваивания
Программа должна находить и проверять правильность написания операторов присваивания в исходном...

Перегрузка оператора присваивания
Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу. Опять же вопрос по...

Перегрузка оператора присваивания
Всем привет! По заданию программа должна содержать перегруженную операцию «=», использование...

Переопределение оператора присваивания
Приветствую всех. Подскажите, как переопределить оператор присваивания в классе таким образом,...

Перегрузка оператора присваивания
Доброго времени суток всем! Никак не могу правильно написать перегрузку оператора присваивания. ...

Перегрузка оператора присваивания
struct pointer_command { public: void * x; public: void set(void * y){x = y; } void...


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

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

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