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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
#1

Не работает деструктор и операторы - C++

12.02.2009, 00:49. Просмотров 985. Ответов 2
Метки нет (Все метки)

Задача, на создание класса «вектор в n-мерном пространстве». Я первоначально сделал эту задачу с статическим выделением памяти, но сказали, что нужно динамически. Сейчас приходится переделывать практически все операторы, т.к. при статическом выделении можно было проинициализировать весь массив координат нулями, а сейчас определять, какой вектор больше, и принимать соответствующие действия.
И первый вопрос: почему не работает деструктор, т.е. не освобождает динамически выделенную память?
C++
1
2
3
4
5
Vector::~Vector ()
{
    delete [] itsCoordinates;
    itsAmount = 0;
}
Если закомментировать, то всё работает нормально.

При перегрузке оператора суммы, нужно определить, какой вектор больше, если они не равны, то недостающие координаты считать равными нулю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const Vector Vector::operator+ (const Vector & rhs)
{
    int min, max, i;
    bool flag;
    flag = false;
    if (itsAmount != rhs.GetItsAmount ())
        flag = true;
    max = (itsAmount >= rhs.GetItsAmount () ? itsAmount : rhs.GetItsAmount ());
    min = (itsAmount <= rhs.GetItsAmount () ? itsAmount : rhs.GetItsAmount ());
    Vector temp (max);
    if (flag)
    {
        for (i = 0; i < min; i++)
            temp.itsCoordinates [i] = itsCoordinates [i] + rhs.GetItsCoordinates (i);
        for (i = min; i < max; i++)
            temp.itsCoordinates [i] = rhs.GetItsCoordinates (i);
    }
    else
        for (i = 0; i < max; i++)
            temp.itsCoordinates [i] = itsCoordinates [i] + rhs.GetItsCoordinates (i);
    return temp;
}
Если векторы равны, тогда работает, иначе выводится результат, при чём неправильный, и выскакивает сообщение об ошибке.
Если ввести размерность векторов, например, у первого 5, второго 6, тогда сообщение не выскакивает, исли 3 и 5, тогда выскакивает. При чём, не смотря на то, что сам оператор и параметр в нём объявлен как const, первоначальные координаты меняются.
Я вообще не представляю, в чём может быть проблема.

И ещё вопрос: первоначально мы проинициализировали объект нулями, то есть, вызывается этот конструктор:
C++
1
2
3
4
5
6
7
8
Vector::Vector (int value, int amount)
{
    int i;
    itsCoordinates = new int [amount];
    itsAmount = amount;
    for (i = 0; i < amount; i++)
        itsCoordinates [i] = value;
}
И выделяется память на 0 байт. Потом при вызове оператора >>:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream &operator>> (istream & input, Vector & rhs)
{
    int value;
    cout << "Введите количество координат\n";
    input >> rhs.itsAmount;
    for (int i = 0; i < rhs.GetItsAmount (); i++)
    {
        cout << "Координата " << i + 1 << " = ";
        input >> value;
        rhs.SetItsCoordinates (value, i);
    }
    return input;
}
мы вводим количество координат. Вызывается ли при этом конструктор снова, или, как тогда выделяется память под введённое количество?

Вот код:
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
#include <iostream>
 
using namespace std;
 
int const nmax = 100;
 
class Vector
{
public:
    Vector ();                          //Конструкторы и деструктор
    Vector (int, int);
    ~Vector ();
    void SetItsAmount (int);                //Методы для координат и необходимого количества
    void SetItsCoordinates (int , int); 
    int GetItsAmount () const;
    int GetItsCoordinates (int) const;
    const Vector operator+ (const Vector &); // Сложение с получением нового объекта
    Vector operator= (const Vector &);       // Присваивание одного вектора другому
 
private:
    Vector (int);                       // Конструктор для операторов +,-,*
    int itsAmount;                      // Нужное количество (вводится пользователем)
    int *itsCoordinates;            // Координаты
    friend istream &operator>> (istream &, Vector &);           // Ввод/Вывод Вектора
    friend ostream &operator<< (ostream &, const Vector &); 
};
 
 
Vector::Vector ()
{
    itsCoordinates = new int [0];
    itsAmount = 0;
}
 
Vector::Vector (int value, int amount)
{
    int i;
    itsCoordinates = new int [amount];
    itsAmount = amount;
    for (i = 0; i < amount; i++)
        itsCoordinates [i] = value;
}
 
Vector::Vector (int amount)
{
    itsCoordinates = new int [amount];
    itsAmount = amount;
}
 
Vector::~Vector ()
{
    /*delete [] itsCoordinates;
    itsAmount = 0;*/
}
 
void Vector::SetItsAmount (int amount)
{
    itsAmount = amount;
}
 
void Vector::SetItsCoordinates (int value, int i)
{
    itsCoordinates [i] = value;
}
 
int Vector::GetItsAmount () const
{
    return itsAmount;
}
 
int Vector::GetItsCoordinates (int i) const
{
    return itsCoordinates [i];
}
 
const Vector Vector::operator+ (const Vector & rhs)
{
    int min, max, i;
    bool flag;
    flag = false;
    if (itsAmount != rhs.GetItsAmount ())
        flag = true;
    max = (itsAmount >= rhs.GetItsAmount () ? itsAmount : rhs.GetItsAmount ());
    min = (itsAmount <= rhs.GetItsAmount () ? itsAmount : rhs.GetItsAmount ());
    Vector temp (max);
    if (flag)
    {
        for (i = 0; i < min; i++)
            temp.itsCoordinates [i] = itsCoordinates [i] + rhs.GetItsCoordinates (i);
        for (i = min; i < max; i++)
            temp.itsCoordinates [i] = rhs.GetItsCoordinates (i);
    }
    else
        for (i = 0; i < max; i++)
            temp.itsCoordinates [i] = itsCoordinates [i] + rhs.GetItsCoordinates (i);
    return temp;
}
 
Vector Vector::operator= (const Vector & rhs)
{
    int i;
    if (this == &rhs)
        return *this;
    itsAmount = rhs.GetItsAmount ();
    for (i = 0; i < rhs.GetItsAmount (); i++)
        itsCoordinates [i] = rhs.GetItsCoordinates (i);
    return *this;
}
 
istream &operator>> (istream & input, Vector & rhs)
{
    int value;
    cout << "Введите количество координат\n";
    input >> rhs.itsAmount;
    for (int i = 0; i < rhs.GetItsAmount (); i++)
    {
        cout << "Координата " << i + 1 << " = ";
        input >> value;
        rhs.SetItsCoordinates (value, i);
    }
    return input;
}
 
ostream &operator<< (ostream & output, const Vector & rhs)
{
    int i;
    for (i = 0; i < rhs.GetItsAmount (); i++)
        output << "Координата " << i + 1 
        << " = " << rhs.GetItsCoordinates (i) << endl;
    return output;
}
 
 
int main ()
{
    setlocale (LC_ALL,".1251");
    Vector Vector1 (0, 0), Vector2 (0,0), Vector3;
 
    cout << "Первый вектор:\n";
    cin >> Vector1;
    cout << endl;
    
    cout << "Второй вектор:\n";
    cin >> Vector2;
    cout << endl;
 
    Vector3 = Vector1 + Vector2;
 
    cout << Vector1 << endl << Vector2 << endl << Vector3 << endl;
    return 0;
}
Помогите, пожалуйста, разобраться.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2009, 00:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает деструктор и операторы (C++):

Не работает деструктор - C++
Выписал пример из самоучителя, но выяснилось что не работает деструктор. В чем проблема? #include &lt;iostream&gt; using namespace std; ...

Не работает деструктор C++ - C++
Работаю в среде DEVc++ #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class Employee { ...

Не работает деструктор - C++
Прошу помощи.Делаю лабораторную. Написал программу для подсчета суммы элементов в тех строках динамического массива, которые содержат хотя...

не работает деструктор - C++
это моя первая программа..я еще не особо разобралась..обьясните почему не работает деструктор и как исправить ошибки #include...

Не работает деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using std::cout; #pragma hdrstop #pragma argsused class vect { public: vect(int...

Почему деструктор не работает? - C++
Вроде написал все правильно, а почему то деструктор не работает, данные HI не выводит, почему ? #include &lt;iostream&gt; using namespace...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
12.02.2009, 02:14 #2
1. Где конструктор копирования?
2.
Код
Vector::Vector ()
{
    itsCoordinates = new int [0];
    itsAmount = 0;
}
Вот этот new никуда не годится. Вместо него присвой NULL указателю
Код
void Vector::SetItsAmount (int amount)
{
    itsAmount = amount;
}
а заново память выделять?
Код
Vector::~Vector ()
{
    delete [] itsCoordinates;
    itsAmount = 0;
}
А если itsCoordinates== NULL ?

Код
istream &operator>> (istream & input, Vector & rhs)
{
    int value;
    cout << "Введите количество координат\n";
    input >> rhs.itsAmount;
    for (int i = 0; i < rhs.GetItsAmount (); i++)
    {
        cout << "Координата " << i + 1 << " = ";
        input >> value;
        rhs.SetItsCoordinates (value, i);
    }
    return input;
}
А здесь память выделить?

Это не все ошибки.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
16.02.2009, 00:55  [ТС] #3
Спасибо тебе огромное!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2009, 00:55
Привет! Вот еще темы с ответами:

Почему не работает деструктор? - C++
Собственно говоря, почему? #include &lt;iostream&gt; using namespace std; class Osoba{ public : char* imie; int wiek; ...

Почему не работает деструктор? - C++
Подскажите пожалуйста, почему у меня не работает деструктор? #include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; ...

Как работает деструктор? - C++
1.Деструктор вызывается когда объект удаляется? ИЛИ 2. Сам деструктор удаляет объект? P.s. Надеюсь понятно))

почему деструктор работает вначале? - C++
#pragma once class Student { private: char* name; int course; public: Student(void); ~Student(void); ...


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

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

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