Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/163: Рейтинг темы: голосов - 163, средняя оценка - 4.70
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор

21.03.2011, 18:06. Показов 34120. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
нужна ваша помощь!
нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и деструктор!
кроме этого нужно создать конструктор который принимает кол элементов и указатель на данные
создать оператор перехода до типа который сохраняет класс!
вот мой код:
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
#include "stdafx.h"
#include "stdio.h"
#include <time.h> 
#include <stdlib.h>
 
class vector
{  
private:
    int* m;
    int size;
public :
    vector(int n = 0);
    vector(const vector &vector2);
    ~vector();
};
vector::vector( int n )
{   
    if (n < 0) n = 0;
    size = n;
    m = new int[n];
if(!m)
printf("Error");
else
m = NULL;
}
vector::vector(const vector &vector2)
{
    size = vector2.size;
        m = new int [size];
    for(int i = 0; i<size;i++)
        m[i] = vector2.m[i];
    printf("kopia stvorena !");
}
vector::~vector()
{
        delete[] m;
}
vector(int *m, int size)
{
      srand(time(NULL))
          if(!m)
              printf("error")
          else
          for(int i = 0; i < size; i++)
           m[i] = rand()% 99;
}
 
 
int main()
{  
    vector v1(45),
    
 system("pause");
    return 0;
}
что не так, пожалуйста с коментами
я только что начал изучать ООП!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2011, 18:06
Ответы с готовыми решениями:

Шаблонный класс (конструктор по умолчанию, основной конструктор и конструктор копирования; перегрузить операторные функции)
5.1. Разработать шаблонный класс Set. Класс должен содержать конструктор по умолчанию, основной конструктор и конструктор копирования....

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

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

25
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
21.03.2011, 18:23
C++
1
2
3
4
5
6
7
8
9
10
vector::vector( int n )
{   
    if (n < 0) n = 0;
        size = n;
    m = new int[n];
    
    if (!m) printf("Error");
    else m = NULL; // Круто вы тут! Получается если память выделили успешно
                 // и указатель ненулевой, так мы сами его обнулим.
}
Дальше не смотрел.
Не стоит делать вывод на консоль в таком классе. По идее он же может и в других типах приложений использоваться. Например, в службе, кто тогда читать это сообщение будет?
1
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
21.03.2011, 21:46  [ТС]
да, не спорю, я тут затупил!
а по остальним заданиям кто - нибудь может ответить ?
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
21.03.2011, 23:55
Да, пока можно еще с этим конструктором продолжать.
C++
1
2
3
4
5
6
7
vector::vector( int n )
{   
    if (n < 0) n = 0; // Будет m = new int[0], так можно, но вы понимаете, зачем так делаете?
        size = n;
    m = new int[n]; // Что произойдет, если new не сможет выделить память? Нужна ли следующая строка?
    if (!m) printf("Error");
}
По стандарту С++ в случае неудачи new генерирует std::bad_alloc (правда, в старых компиляорах это не совсем так). Если мы получим исключение, то до if (!m) printf("Error") уже не доберемся.

Я не вижу конструктора по умолчанию, т.е. нельзя просто vector vec. Это конечно ваше решение, но может стоило в этом случае определить какой-нибудь разумный размер: vector::vector(int n = 50)

Вы по каким-то соображениям определили свой копирующий конструктор vector::vector(const vector &vector2). Но что будет если вот так использовать ваш класс:
C++
1
2
3
vector vec1(2);
vector vec2(vec1); // хорошо.
vector vec3 = vec2; // а здесь?
0
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
22.03.2011, 00:19  [ТС]
Мда..... ну я тут наворотил
дело в том что нам это почти не объясняли.......
не могли бы вы показать как это нужно правильно сделать ?
потому что без этого я не смогу продолжить свою роботу
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
22.03.2011, 00:24
Вот только сегодня писал здесь, можете посмотреть на реализацию присваивания, копирования, да и другие вещи тоже...
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
class Array
{
public:
    Array();
    Array(size_t);
    Array(const Array &);
    ~Array();
 
    size_t size() const;
    size_t capacity() const;
 
    void resize(size_t);
 
    void push_back(double);
    void erase(size_t, size_t);
 
    const Array &operator=(const Array &);
 
    const double &operator[](size_t) const;
    double &operator[](size_t);
 
private:
    double *_array;
    size_t _size;
    size_t _capacity;
};
 
Array::Array():
_array(0),
_size(0),
_capacity(0)
{
}
 
Array::Array(size_t size):
_size(size),
_capacity(1)
{
    while (_capacity < _size)
        _capacity *= 2;
 
    _array = new double [_capacity];
}
 
Array::Array(const Array &original):
_size(original._size),
_capacity(original._capacity)
{
    _array = new double [_capacity];
 
    for (size_t i = 0; i < _size; ++i)
        _array[i] = original._array[i];
}
 
Array::~Array()
{
    delete [] _array;
}
 
size_t Array::size() const
{
    return _size;
}
 
size_t Array::capacity() const
{
    return _capacity;
}
 
void Array::resize(size_t new_size)
{
    _capacity = 1;
 
    while (_capacity < new_size)
        _capacity *= 2;
 
    double *new_array = new double [_capacity];
 
    if (_array != 0)
    {
        size_t count = new_size < _size ? new_size : _size;
 
        for (size_t i = 0; i < count; ++i)
            new_array[i] = _array[i];
 
        delete [] _array;
    }
 
    _array = new_array;
    _size = new_size;
}
 
void Array::push_back(double element)
{
    if (_size == _capacity)
    {
        resize(_size + 1);
        --_size;
    }
 
    _array[_size++] = element;
}
 
void Array::erase(size_t begin_index, size_t end_index)
{
    size_t new_capacity = 1;
    size_t new_size = _size - end_index + begin_index + 1;
 
    while (new_capacity < new_size)
        new_capacity *= 2;
 
    double *new_array = new double [new_capacity];
 
    for (size_t i = 0; i <= begin_index; ++i)
        new_array[i] = _array[i];
 
    for (size_t i = begin_index + 1, j = end_index; j < _size; ++i, ++j)
        new_array[i] = _array[j];
 
    delete [] _array;
 
    _size = new_size;
    _capacity = new_capacity;
    _array = new_array;
}
 
const Array &Array::operator=(const Array &rhs)
{
    if (&rhs != this)
    {
        _size = rhs._size;
        _capacity = rhs._capacity;
 
        delete [] _array;
 
        _array = new double [_capacity];
 
        for (size_t i = 0; i < _size; ++i)
            _array[i] = rhs._array[i];
    }
 
    return *this;
}
 
const double &Array::operator[](size_t index) const
{
    return _array[index];
}
 
double &Array::operator[](size_t index)
{
    return _array[index];
}
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.03.2011, 01:40
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
class Allocator
{
public:
    template<class T1, class T2>
    void construct(T1* p, const T2& value)
    {
        new(p) T1(value);
    }
    template<class T>
    void destroy(T* p)
    {
        p->~T();
    }
    template<class Iter>
    void destroy(Iter first, Iter last)
    {
        while(first != last)
        {
            destroy(*&first);
            ++first;
        }
    }
};
 
template<class T, class Alloc=Allocator>
class Vector_base
{
public:
    Vector_base(T sz=0, Alloc al=Alloc()):arr_(static_cast<T*>(sz == 0 ? 0 :
        operator new(sizeof(T)*sz))), cap_(sz), sz_(sz), al_(al)
    {
    }
    ~Vector_base()
    {
        al_.destroy(arr_, arr_+sz_);
        operator delete(arr_);
    }
    void Swap(Vector_base& other) /*throw()*/
    {
        std::swap(arr_, other.arr_);
        std::swap(sz_, other.sz_);
        std::swap(cap_, other.cap_);
    }
    T* arr_;
    size_t sz_;
    size_t cap_;
    Alloc al_;
private:
    Vector_base(const Vector_base&);
    Vector_base& operator =(const Vector_base&);
};
 
template<class T, class Alloc=Allocator>
class Vector
{
public:
    Vector(size_t sz=0, Alloc al=Alloc()):impl_(sz, al)
    {
    }
    ~Vector()
    {
    }
    Vector(const Vector& other):impl_(other.impl_.cap_)
    {
        while(impl_.sz_ != other.impl_.sz_)
        {
            impl_.al_.construct(impl_.arr_ + impl_.sz_,
                other.impl_.arr_[impl_.sz_]);
            ++impl_.sz_;
        }
    }
    Vector& operator =(const Vector& other)
    {
        Vector temp(other);
        impl_.Swap(temp.impl_);
        return *this;
    }
    const size_t size() const
    {
        return impl_.sz_;
    }
    T& operator [](const size_t idx)
    {
        return *(impl_.arr_+idx);
    }
    const T& operator [](const size_t idx) const
    {
        return *(impl_.arr_+idx);
    }
private:
    Vector_base<T> impl_;
};
 
int main()
{
    const int n=10;
    Vector<int> vec(n);
    for(int i=0; i<n; ++i)
        vec[i]=i+1;
    for(size_t i=0; i<vec.size(); ++i)
        std::cout<<vec[i]<<'\n';
    return 0;
}
Ну или сюда Вектор наподобие STL можете заглянуть.
1
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
22.03.2011, 12:40  [ТС]
Всем огромное спасибо!
извините, что достаю, но можно с коментами, потому что я некоторые моменты не до конца понимаю
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
22.03.2011, 14:44
kaffein, вы уж лучше скажите, что не понимаете.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
22.03.2011, 17:12
Я не вижу конструктора по умолчанию, т.е. нельзя просто vector vec.
А ведь он есть.) Но будет ошибка времени выполнения. Ибо, int m = new int[0] - низя.

Цитата Сообщение от bigredcat Посмотреть сообщение
По стандарту С++ в случае неудачи new генерирует std::bad_alloc
Это вообще весёлая тема, но я пруф не вспомню никак. Суть в том, что реальное выделение памяти происходит только при использовании, т.е. в большинстве случаев вообще невозможно узнать об ошибке выделения памяти, пока приложение не упадёт.
Александреску, кажется, или Саттер... не помню...
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:31
silent_1991
ты, конечно, тоже хорош. В функциях resize, erase память перевыделяешь каждый раз, хотя делать это надо лишь когда capacity изменился. Также повсюду дублирование кода: в вычислении capacity, копировании из массива в массив. В общем фэйл.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
22.03.2011, 17:35
slice, перепишите.
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:38
silent_1991, мне больше заняться нечем
0
22.03.2011, 17:39

Не по теме:

slice, похоже, так и есть.

0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:48
silent_1991
Чтож, по-крайней мере ты не отрицаешь, что твой аррэй сосет. Уже хорошо.
Между прочим, критика кода очень мощный стимул для роста программиста. Жаль, что ты это пока не осознал.
0
22.03.2011, 17:50

Не по теме:

slice, ага, зато вы много осознали, потому и употребляете выражения типа "Аррэй сосёт".
Критика бывает разная. Вашу, например, стоило бы смыть в унитаз.

0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:52
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вашу, например, стоило бы смыть в унитаз.
ага, вслед за вашим кодом
0
22.03.2011, 17:53

Не по теме:

slice, хоть бы и так, лишь бы она оказалась там.

0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:55
silent_1991, договорились
0
22.03.2011, 17:55

Не по теме:

Нет, я не говорю, что советы плохи, но они обличены в такую форму, что следовать им нет никакого желания.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2011, 17:55
Помогаю со студенческими работами здесь

Использование классов (Описать конструктор по умолчанию, конструктор с параметром, деструктор...)
Помогите переделать программу, чтобы в ней использовались классы. Описать конструктор по умолчанию, конструктор с параметром,...

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

Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор
Создать класс «матрица». Данный класс должен содержать элементы типа int, определяющие число строк, столбцов и состояние ошибки. Определить...

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

Создать класс MyString, конструктор, деструктор
1.Создать класс MyString. Класс должен содержать: - Конструктор - Деструктор - Статическое свойство содержащее максимально...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru