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

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

21.03.2011, 18:06. Показов 33680. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru