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

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

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

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

12.02.2009, 00:49. Просмотров 975. Ответов 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++ Не работает деструктор
C++ не работает деструктор
почему деструктор работает вначале? C++
C++ ООП. Не работает задача (конструктор, деструктор)
Почему деструктор не работает? C++
C++ Не работает деструктор C++
C++ Не работает деструктор
C++ Не работает деструктор
Почему не работает деструктор? C++
Почему не работает деструктор? C++
C++ Как работает деструктор?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт С++
2222 / 737 / 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
Спасибо тебе огромное!
Yandex
Объявления
16.02.2009, 00:55     Не работает деструктор и операторы
Ответ Создать тему
Опции темы

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