Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Очистить экран http://www.cyberforum.ru/cpp-beginners/thread23080.html
Как отчистить экран в с++ ????
C++ Осуществить проверку на правильность ввода размерности массивов В задаче память под массивы выделяется динамически (для исходной матрицы - в объеме, минимально необходимом для хранения данных), размерности массивов не превосходят 10. Необходимо: - осуществить... http://www.cyberforum.ru/cpp-beginners/thread23077.html
Как вообще работают fstream.open(), class.pointer to massive? C++
Мне надо узнать направление поиска информации общего характера по тому, как данная прога с большим числом циклов обменивается информацией с ХР И процессором. Т.е. как вообще работают...
C++ шаблонные функции для нахождения корней линейного и квадратного уравнения
:help::help::help:Надо сделать Console программку : Написать функцию, которая принимает в качестве параметров вещественное число и количество знаков после десятичной точности, которые должны...
C++ Получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m http://www.cyberforum.ru/cpp-beginners/thread23039.html
Даны натуральные числа n,m. Получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m. :wall:
C++ Минимум среди элементов диагоналей, параллельных главной диагонали матрицы В целочисленной квадратной матрице a = 0 для элементов, лежащих выше побочной диагонали. Требуется определить - сумму элементов в тех строках, которые не содержат отрицательных элементов; - минимум... подробнее

Показать сообщение отдельно
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782

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

12.02.2009, 00:49. Просмотров 999. Ответов 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;
}
Помогите, пожалуйста, разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru