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

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

Восстановить пароль Регистрация
 
Magister
 Аватар для Magister
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 6
28.11.2012, 22:28     Перегрузка бинарного оператора + #1
Добрый вечер! В последнее время мне не удаётся перегрузить оператор +, чтобы он поэлементно складывал одномерные массивы двух классов.
Перегрузка оператора
C++
1
2
3
4
5
6
7
8
9
Vector Vector::operator+(const Vector& right)
{
    int requiredSize = (this->size <= right.size)? this->size : right.size;
    Vector temp(requiredSize);
    for(int i = 0; i < requiredSize; i++)
            temp.massiv[i] = this->massiv[i] + right.massiv[i];
    
    return temp;
}
Кликните здесь для просмотра всего текста

Интерфейс класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
class Vector
{
public:
    Vector operator+(const Vector& right);
    int& operator [](int);
    void view();
    void input();
    int getSize();
    void setSize(int);
    Vector(int);
    Vector(void);
    ~Vector(void);
private:
    int *massiv;
    int size;
};
Реализация класса:
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
#include "StdAfx.h"
#include "Vector.h"
 
Vector Vector::operator+(const Vector& right)
{
    int requiredSize = (this->size <= right.size)? this->size : right.size;
    Vector temp(requiredSize);
    for(int i = 0; i < requiredSize; i++)
            temp.massiv[i] = this->massiv[i] + right.massiv[i];
    
    return temp;
}
 
int& Vector::operator[] (int index)
{
    if (index < 0)
    {
        cerr << "Out of memory ( massiv[i]<0 )";
        return massiv[0];
    }
    else
        if (index >= size)
        {
            cerr << "Out of memory ( massiv[i]>=0 )";
            return massiv[size-1];      
        }
        else
            return massiv[index];
}
 
void Vector::view()
{
    for (int i = 0; i < size; i++)
    {
        cout << massiv[i] << " ";
    }
    cout << endl;
}
void Vector::input()
{
    for(int i = 0; i < size; i++)
    {
        cout << "Vector[" << i << "] = ";
        cin >> massiv[i];
    }
 
}
 
int Vector::getSize()
{
    return size;
}
void Vector::setSize(int s)
{
    size = s;
}
Vector::Vector(void)
{
    size = 3;
    massiv = new int[3];
}
 
Vector::Vector(int s)
{
    size = s;
    massiv = new int[size];
}
 
 
Vector::~Vector(void)
{
    delete massiv;
}
И главная часть программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "Vector.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Vector v1(3), v2(3), v3(3);
 
    v1.input();
    v2.input();
    v3 = v1 + v2;
    v3.view();
    
    v1.~Vector();
    v2.~Vector();
    v3.~Vector();
    return 0;
}


Ошибки не выдаются, но на моём пути встречаются несколько подводных камней:
Не выводится результат на экран, будто из функции не передалось значение обратно. Если написать так:
C++
1
(v1+v2).view();
Вывод сработает и покажет, что результат не передался. Кроме того, вместо стандартной фразы "Нажмите на любую клавишу", придётся вручную закрывать приложение. Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 22:28     Перегрузка бинарного оператора +
Посмотрите здесь:

C++ Перегрузка бинарного оператора
Перегрузка бинарного оператора << в template классе C++
C++ Перегрузка оператора +=
C++ Перегрузка оператора ->
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
28.11.2012, 22:32     Перегрузка бинарного оператора + #2
конструктор копирования определен?
Magister
 Аватар для Magister
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 6
29.11.2012, 00:57  [ТС]     Перегрузка бинарного оператора + #3
ValeryS, нет. Я его только что сделал, и часть проблемы
C++
1
(v1+v2).view();
уже разрешилась.

Добавлено через 1 час 53 минуты
Я перегрузил оператор присваивания = и теперь всё работает идеально, ...
C++
1
2
3
4
5
6
7
8
Vector Vector::operator= (const Vector& right)
{
    size = right.size;
    massiv = new int[size];
    for(int i = 0; i<size; i++)
        massiv[i] = right.massiv[i];
    return *this; //возвращаем объект, генерирующий вызов
}
кроме 1 детали: деструкторы в конце программы не позволяют программе выходить по нажатию клавиши...
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
29.11.2012, 01:18     Перегрузка бинарного оператора + #4
Цитата Сообщение от Magister Посмотреть сообщение
Я перегрузил оператор присваивания =
а еще перегрузи += -=

Цитата Сообщение от Magister Посмотреть сообщение
кроме 1 детали: деструкторы в конце программы не позволяют программе выходить по нажатию клавиши...
какой клавиши ???
что то я у тебя в майне никаких клавиш не видел
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
2
3
v1.~Vector();
 v2.~Vector();
 v3.~Vector();
нахрена ты деструкторы явно вызываешь?
сами вызовутся когда переменная выйдет за область видимости (когда майн закончится)

Добавлено через 4 минуты
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
2
3
4
Vector::~Vector(void)
{
delete massiv;
}
delete[] massiv; !!!!!!!!
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
Vector::Vector(void)
{
 size = 3;
 massiv = new int[3];
}
Vector::Vector(int s)
{
 size = s;
 massiv = new int[size];
}
можно объеденить в один конструктор с параметрами по умолчанию
C++
1
2
3
4
5
Vector::Vector(int s=3)
{
 size = s;
 massiv = new int[size];
}
Добавлено через 3 минуты
вот где у тебя ошибка
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
2
3
4
Vector Vector::operator= (const Vector& right)
{
 size = right.size;
 massiv = new int[size]
;
ты выделил новую память и присвоил указатель massiv а старый указатель потерял
утечка однако

пиши вот так
C++
1
2
delete[] massiv;
massiv = new int[size];
Magister
 Аватар для Magister
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 6
29.11.2012, 01:26  [ТС]     Перегрузка бинарного оператора + #5
Явно объявлять деструктор нужно только для динамически созданных данных, поэтому их ставить явно не видно смысла)

Добавлено через 4 минуты
ValeryS, ого, да ты словно прирождённый компилятор, спасибо)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,056
29.11.2012, 01:30     Перегрузка бинарного оператора + #6
Цитата Сообщение от Magister Посмотреть сообщение
Явно объявлять деструктор
я сказал не объявлять а вызывать
напиши в реализации деструктора
C++
1
printf("destructor");
и посмотри когда он вызовется

Добавлено через 2 минуты
Цитата Сообщение от Magister Посмотреть сообщение
ого, да ты словно прирождённый компилятор,
"И опыт, сын ошибок трудных"(с) А С Пушкин
Yandex
Объявления
29.11.2012, 01:30     Перегрузка бинарного оператора +
Ответ Создать тему
Опции темы

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