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

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

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

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

29.01.2009, 18:12. Просмотров 3338. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2009, 18:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор (C++):

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

5
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
29.01.2009, 18:33 #2
все работает.
0
Vourhey
Почетный модератор
6482 / 2256 / 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. кстати, условие задачи не смотрел. Только ошибку
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
29.01.2009, 22:04 #4
Ну, если уж есть конструктор по умолчанию ("без параметров"), деструктор и конструктор копирования, то для полного счастья не хватает только operator=(const vector& vec);
0
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;
}
0
WhiteCat
Сообщений: n/a
26.10.2009, 19:08 #6
Вот задание похоже. Как будет выглядеть программа в этом случае?

Создать абстрактный тип данных-класс вектор, который имеет указатель на long, число элементов и переменную состояния. Определить конструктор без параметров,конструктор с параметром, конструктор с двумя параметрами. Конструктор без параметров выделяет место для одного элемента и инициализирует его в ноль. Конструктор с одним параметром,-размер вектора,-выделяет место и инициализирует номером в массиве,конструктор с двумя параметрами выделяет место (первый аргумент) и инициализирует вторым аргументом. Деструктор освобождает память. Определить функцию, которая присваивает элементу массива некоторое значение (параметр по умолчанию), функцию которая получает некоторый элемент массива. В переменную состояния устанавливать код ошибки, когда не хватает памяти, выходит за пределы массива. Определить функцию печати. Определить функции сложения, умножения, вычитания, которые производят эти арифметические операции с данными этого класса и встроенного long. Определить методы сравнения: больше, меньше или равно. Предусмотреть возможность подсчёта числа объектов данного типа. Проверить работу этого класса.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2009, 19:08
Привет! Вот еще темы с ответами:

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
26.10.2009, 19:08
Ответ Создать тему
Опции темы

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