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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Ammaximus
3 / 3 / 1
Регистрация: 15.01.2009
Сообщений: 26
#1

Конструктор - C++

29.01.2009, 18:12. Просмотров 3139. Ответов 5
Метки нет (Все метки)

Создать абстрактный тип данных - класс вектор, который имеет указатель на float,
число элементов и переменную состояния. Определить конструктор без параметров,
конструктор с параметром, конструктор с двумя параметрами. Конструктор без
параметров выделяет место для одного элемента и инициализирует его в ноль.
Конструктор с одним параметром, - размер вектора, - выделяет место и инициализирует
номером в массиве, конструктор с двумя параметрами выделяет место (первый аргумент)
и инициализирует вторым аргументом. Деструктор освобождает память. Определить
функцию, которая присваивает элементу массива некоторое значение (параметр по
умолчанию), функцию которая получает некоторый элемент массива. В переменную
состояния устанавливать код ошибки, когда не хватает памяти, выходит за пределы
массива. Определить функцию печати. Определить функции сложения, умножения,
вычитания, которые производят эти арифметические операции с данными этого класса и
встроенного float. Определить методы сравнения: больше, меньше или равно.
Предусмотреть возможность подсчета числа объектов данного типа. Проверить работу
этого класса.
Вот что получилось. программа работает. компилируется, но вылетает во время работы. В чем дело?
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
#include <iostream.h>
 
class  vector {
    float *p;
    int number;
    bool flag;
    static int num_objects;
 
public:
    vector(){
        p=new float[1];
        p[0]=0;
        number=1;
        flag=false;
    }
 
    vector(int num){
        p=new float[num];
        for (int i=0; i<num; i++) p[i]= i;
        number=num;
        flag=false;
    }
 
    vector(int num, float vect){
        p=new float[num];
        for (int i=0; i<num; i++) p[i]=vect;
        number=num;
        flag=false;
    }
    
    ~vector(){
        delete [] p;
    }
    
    void set(int num, float vect){
        if (number<=num) {
            flag=true;
            return;
        }
        p[num]=vect;
        return;
    }
 
    void set(int num){
        if (number<=num) {
            flag=true;
            return;
        }
        p[num]=13; // Значение по умолчанию
        return;
    }
 
    float get(int num){
        if (number<=num) {
            flag=true;
            return 0;
        }
        return p[num];
    }
    void print(int num){
        if (number<=num) {
            flag=true;
            return;
        }
        cout << *(p+num);
    };
 
    void print(){
        for (int i=0; i<number; i++) cout << "  " << *(p+i);
        cout << endl;
    }
 
    void add(vector target_vector, int pos_source, int pos_target){
        this->p[pos_target]+=target_vector.get(pos_source);
    };
 
    void sub(vector target_vector, int pos_source, int pos_target){
        this->p[pos_target]-=target_vector.get(pos_source);
    };
 
    void mul(vector target_vector, int pos_source, int pos_target){
        this->p[pos_target]*=target_vector.get(pos_source);
    };
    int diff(vector target_vector, int pos_source, int pos_target){
        if (this->p[pos_target]>target_vector.get(pos_source)) return 1;
        if (this->p[pos_target]<target_vector.get(pos_source)) return -1;
        return 0;
 
    };
 
 
 
 
};
int main(){
    vector a;
    vector b(7);
    vector c(4,8 );
    b.print();
    b.add(c,1,1);
    b.print();
    b.mul(c,1,1);
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2009, 18:12     Конструктор
Посмотрите здесь:

Конструктор C++
Конструктор C++
Конструктор C++
C++ this и конструктор
C++ конструктор
Конструктор C++
C++ Конструктор
Конструктор C++ и new C++
C++ Конструктор
C++ Конструктор
C++ Конструктор
Конструктор C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
29.01.2009, 18:33     Конструктор #2
все работает.
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.01.2009, 19:23     Конструктор #3
Ammaximus, ошибка в том, что в классе ты работаешь с указателями, но ты не переопределил конструктор копирования.
Смотри, ты передаешь, например, в метод add объект vector по значению. При передаче по значению создается копия объекта, то есть, вызывается конструктор копирования. Но конструктора копирования у тебя нет, поэтому в функцию add и в остальные указатель на p не меняется, а по выходу из нее вызывается деструктор для vector, в котором delete [] p. То есть после выхода из метода add у тебя в объекте с массив твой уже удален. А после вызова mul в деструкторе он пытается удалить его еще раз. Отсюда и ошибка. Если ты уберешь mul, то ошибка все равно останется, так как, по завершению работы будут вызваться деструкторы объектов, а в объекте с уже нет твоего массива. И его повторное удаление снова вызовет ошибку.

Переопредели стандартный конструктор копирования для класса vector, чтобы можно было передавать по значению.

Добавлено через 25 минут 13 секунд
Вообщем, если особо не заморачиваться и сделать так, 'чтобы просто работало', то я бы вставил следующие методы:
C++
1
2
3
4
5
6
7
8
9
10
    int getCount() const
    {
        return this->number;
    }
 
    vector(const vector& vec)
    {
        p = new float[vec.getCount()];
        for(int i=0;i < vec.getCount();i++) p[i] = vec.get(i);
    }
Метод get, соответственно, тоже сделать константным.

P. S. кстати, условие задачи не смотрел. Только ошибку
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
29.01.2009, 22:04     Конструктор #4
Ну, если уж есть конструктор по умолчанию ("без параметров"), деструктор и конструктор копирования, то для полного счастья не хватает только operator=(const vector& vec);
Ammaximus
3 / 3 / 1
Регистрация: 15.01.2009
Сообщений: 26
08.02.2009, 18:55  [ТС]     Конструктор #5
Не выходит

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
152
153
154
155
156
157
#include <iostream.h>
#define standart 13
 
class  vector {
    float *p;
    int number;
    int flag;
 
public:
    vector(){
        p=new float[1];
        p[0]=0;
        number=1;
        flag=0;
    }
 
    vector(int num){
        p=new float[num];
        for (int i=0; i<num; i++) p[i]= static_cast<float>(i);
        number=num;
        flag=0;
    }
 
    vector(int num, float vect){
        p=new float[num];
        for (int i=0; i<num; i++) p[i]=vect;
        number=num;
        flag=0;
    }
    
    ~vector(){
        delete [] p;
    }
    
    vector(const vector &vec)  
    {  
        p = new float[vec.getCount()];  
        for(int i=0;i < vec.getCount();i++) p[i] = vec.get(i);  
  . }  
 
    
    void set(int num, float vect){
        if (number<=num) {
            flag=1;
            return;
        }
        p[num]=vect;
        return;
    }
 
    void set(int num){
        if (number<=num) {
            flag=1;
            return;
        }
        p[num]=standart; // Г‡Г*Г*Г·ГҐГ*ГЁГҐ ГЇГ® óìîë÷Г*Г*ГЁГѕ
        return;
    }
 
    float get(int num){
        if (number<=num) {
            flag=1;
            return 0;
        }
        return p[num];
    }
    int getCount() const  
    {  
        return this->number;  
    }  
      
    
    void print(int num){
        if (number<=num) {
            flag=1;
            return;
        }
        cout << *(p+num);
    };
 
    void print(){
        for (int i=0; i<number; i++) cout << "  " << *(p+i);
        cout << endl;
    }
 
    // ÔóГ*êöèè ðåГ*ëèçîâГ*Г*Г» Гў ñòèëå Г*ññåìáëåðГ*. Ïðè ýòîì ГҐГ±ГІГј âîçìîæГ*îñòü Г°Г*áîòГ*ГІГј ГЄГ*ГЄ Г±Г® ГўГ±ГҐГ¬ âåêòîðîì, ГІГ*ГЄ ГЁ Г± îòäåëüГ*ûìè ýëåìåГ*ГІГ*ìè.
    // ГЊГ*Г±Г±ГЁГўГ» Г°Г*Г§Г*ûõ Г°Г*çìåðîâ ìîãóò ГіГ·Г*ñòâîâГ*ГІГј Гў îïåðГ*öèÿõ, ïðè ýòîì ëèøГ*ГЁГҐ ýëåìåГ*ГІГ» áîëüøåãî Г¬Г*Г±Г±ГЁГўГ* Г*ГҐ ГіГ·Г*Г±ГІГўГіГѕГІ.
 
    void add(vector target_vector, int pos_source, int pos_target){
        if (control(*this, pos_target) && control(target_vector, pos_source))
            this->p[pos_target]+=target_vector.p[pos_source];
        else this-> flag=1;
    };
 
    void sub(vector target_vector, int pos_source, int pos_target){
        if (control(*this, pos_target) && control(target_vector, pos_source))
            this->p[pos_target]-=target_vector.p[pos_source];
        else this-> flag=1;
    };
    void mul(vector target_vector, int pos_source, int pos_target){
        if (control(*this, pos_target) && control(target_vector, pos_source))
            this->p[pos_target]*=target_vector.p[pos_source];
        else this-> flag=1;
    };
 
 
    void add(vector target_vector){
        for (int i=0; i<(this->number>target_vector.number?target_vector.number:this->number); i++){
            this->p[i]+=target_vector.p[i];
        }
    }
    void sub(vector target_vector){
        for (int i=0; i<(this->number>target_vector.number?target_vector.number:this->number); i++){
            this->p[i]-=target_vector.p[i];
        }
    }
    void mul(vector target_vector){
        for (int i=0; i<(this->number>target_vector.number?target_vector.number:this->number); i++){
            this->p[i]*=target_vector.p[i];
        }
    }
 
    //ÂîçâðГ*Г№Г*ГҐГІ 1, åñëè áîëüøå, -1, åñëè ìåГ*ГјГёГҐ ГЁ 0 åñëè Г°Г*ГўГ*Г»
    int diff(vector target_vector, int pos_source, int pos_target){
        if (this->p[pos_target]>target_vector.get(pos_source)) return 1;
        if (this->p[pos_target]<target_vector.get(pos_source)) return -1;
        return 0;
 
    };
 
    int control(vector &chk, int pos){
        if (chk.number>pos) return 1;
        return 0;
    }
 
 
 
};
 
int main(){
    vector a;
    vector b(7);
    vector c(4,8);
    a.print();
    b.print();
    c.print();
    b.add(c,1,1);
    b.print();
    b.sub(c,1,1);
    b.print();
    b.mul(c);
    b.mul(c,1,1);
    b.print();  
    a.print();
    
    return 0;
}
WhiteCat
Сообщений: n/a
26.10.2009, 19:08     Конструктор #6
Вот задание похоже. Как будет выглядеть программа в этом случае?

Создать абстрактный тип данных-класс вектор, который имеет указатель на long, число элементов и переменную состояния. Определить конструктор без параметров,конструктор с параметром, конструктор с двумя параметрами. Конструктор без параметров выделяет место для одного элемента и инициализирует его в ноль. Конструктор с одним параметром,-размер вектора,-выделяет место и инициализирует номером в массиве,конструктор с двумя параметрами выделяет место (первый аргумент) и инициализирует вторым аргументом. Деструктор освобождает память. Определить функцию, которая присваивает элементу массива некоторое значение (параметр по умолчанию), функцию которая получает некоторый элемент массива. В переменную состояния устанавливать код ошибки, когда не хватает памяти, выходит за пределы массива. Определить функцию печати. Определить функции сложения, умножения, вычитания, которые производят эти арифметические операции с данными этого класса и встроенного long. Определить методы сравнения: больше, меньше или равно. Предусмотреть возможность подсчёта числа объектов данного типа. Проверить работу этого класса.
Yandex
Объявления
26.10.2009, 19:08     Конструктор
Ответ Создать тему
Опции темы

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