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

Ошибка при перегрузке операторов в классе - C++

Восстановить пароль Регистрация
 
erslgoeirjh
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 20
08.11.2013, 18:03     Ошибка при перегрузке операторов в классе #1
Я создал класс myNVector для работы с векторами произвольного размера:

в заголовочном файле:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class myNVector
{
public:
myNVector();
myNVector(int n);
myNVector(int n, long double *massif);
~myNVector();
myNVector& operator=(const myNVector &vect);
friend const myNVector& operator+(const myNVector& vect1, const myNVector& vect2);
//...
public:
int n; // размерность вектора
long double *massif; // элементы вектора
}
в cpp-файле:

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
//...
 
myNVector::myNVector()
{
    n = 0;
    massif = NULL;
}
 
myNVector::myNVector(int n)
{
    int i;
 
    this->n = n;
    this->massif = new long double[n];
    for (i=0; i<n; i++)
    {
        this->massif[i] = 0.0;
    }
}
 
myNVector::myNVector(int n, long double *massif)
{
    int i;
    
    this->n = n;
    this->massif = new long double[n];
    for (i=0; i<n; i++)
    {
        this->massif[i] = massif[i];
    }
}
 
myNVector::~myNVector()
{
    if (massif != NULL)
    {
        delete []massif;
        massif = NULL;
    }
    n = 0;
}
 
myNVector& myNVector::operator=(const myNVector &vect)
{
    int i;
    long double* p;
 
    if (this->massif != NULL)
    {
        p = this->massif;
        delete []p;
        this->massif = NULL;
    }
    this->n = vect.n;
    this->massif = new long double[n]; 
    memmove(this->massif, vect.massif, this->n*sizeof(long double));
    return *this;
}
 
const myNVector& operator+(const myNVector& vect1, const myNVector& vect2)
{
    int i;
    myNVector  resvect;
 
    resvect.n = vect1.n;
    resvect.massif = new long double[resvect.n];
 
    for (i=0; i<vect1.n; i++)
    {
        resvect.massif[i] = vect1.massif[i] + vect2.massif[i];
    }
    return resvect;
}
 
// ...

В основной программе:


C++
1
2
3
4
5
6
7
8
myNVector AVect(2), Avect2(2), Ares(2);
 
Avect.massif[0] = 7.0;
Avect.massif[1] = 8.0;
Avect2.massif[0] = 9.0;
Avect2.massif[1] = 10.0;
 
Ares = Avect + Avect2;

И вот на этой последней строке

C++
1
Ares = Avect + Avect2;

программа бьётся. Выскакивает окно с сообщением:


Debug Error!
Program: f:\Roman\Roman\testvecmat.exe
Invalid allocation size: 4294967295 bytes
(Press Retry to debug the application).

В отладчике в функции operator+(const myNVector& vect1, const myNVector& vect2) всё нормально, а потом происходит обращение к функции operator=(const myNVector &vect) и там с самого начала у переменной vect поле n равно -858993460 , а поле massif вообще не читается.

В чём причина этого? Как исправить ошибку, чтобы Ares = Avect + Avect2; нормально работало?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2013, 18:03     Ошибка при перегрузке операторов в классе
Посмотрите здесь:

При перегрузке операторов не записывает значение C++
непонятное явление при перегрузке умножения в классе матриц C++
Ошибка при перегрузке операторов. C++
Ошибка в перегрузке операторов для класса - итератора C++
Ошибки при перегрузке операторов C++
Сколько используется параметров при перегрузке унарных операторов как френд-функций? C++
C++ Ошибка в перегрузке операторов?
Можно ли при перегрузке операторов задавать дополнительные параметры? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
08.11.2013, 18:12     Ошибка при перегрузке операторов в классе #2
Что-то я не вижу тут ошибок. Ты точно всё показал?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.11.2013, 18:45     Ошибка при перегрузке операторов в классе #3
Оператор плюс должен возвращать не ссылку, а сам экземпляр класса. Ссылка ссылается на лишь временный объект

Добавлено через 26 минут
C++
1
friend myNVector operator+(myNVector vect1, myNVector vect2);
Yandex
Объявления
08.11.2013, 18:45     Ошибка при перегрузке операторов в классе
Ответ Создать тему
Опции темы

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