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

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

27.02.2016, 17:43. Просмотров 424. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2016, 17:43
Ответы с готовыми решениями:

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

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

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

Насчет оператора присваивания
Есть следующий код : #include &lt;iostream&gt; using namespace std; class Array { private:...

Перегрузка оператора присваивания
Здравствуйте! Помогите, пожалуйста разобраться с перегрузкой оператора присваивания. Нужно...

1
nd2
3058 / 2563 / 1122
Регистрация: 29.01.2016
Сообщений: 8,625
27.02.2016, 19:58 2
Компилятор разве не предупреждает, что из operator+ возвращается ссылка на локальный объект?
Цитата Сообщение от mishula Посмотреть сообщение
что нужно изменить.
Делай возврат по значению.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2016, 19:58

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

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

Перегрузка оператора присваивания
мне надо было реализовать конструкторы, деструктор, оператор присваивания, функции ввода /...


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

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

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