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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.68
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
21.03.2011, 18:06     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #1
Всем доброго времени суток!
нужна ваша помощь!
нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и деструктор!
кроме этого нужно создать конструктор который принимает кол элементов и указатель на данные
создать оператор перехода до типа который сохраняет класс!
вот мой код:
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;
}
что не так, пожалуйста с коментами
я только что начал изучать ООП!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2011, 18:06     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Посмотрите здесь:

Класс: конструктор и деструктор C++
Конструктор копирования, деструктор при наследовании C++
C++ Создать любой класс. Реализовать конструктор, деструктор, продемонстрировать работу
Класс, конструктор, деструктор, дружественные функции C++
Разработать класс Airplane (самолет). Определить конструктор и деструктор. Реализовать объявленные методы доступа к данным. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
21.03.2011, 18:23     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #2
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; // Круто вы тут! Получается если память выделили успешно
                 // и указатель ненулевой, так мы сами его обнулим.
}
Дальше не смотрел.
Не стоит делать вывод на консоль в таком классе. По идее он же может и в других типах приложений использоваться. Например, в службе, кто тогда читать это сообщение будет?
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
21.03.2011, 21:46  [ТС]     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #3
да, не спорю, я тут затупил!
а по остальним заданиям кто - нибудь может ответить ?
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
21.03.2011, 23:55     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #4
Да, пока можно еще с этим конструктором продолжать.
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; // а здесь?
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
22.03.2011, 00:19  [ТС]     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #5
Мда..... ну я тут наворотил
дело в том что нам это почти не объясняли.......
не могли бы вы показать как это нужно правильно сделать ?
потому что без этого я не смогу продолжить свою роботу
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.03.2011, 00:24     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #6
Вот только сегодня писал здесь, можете посмотреть на реализацию присваивания, копирования, да и другие вещи тоже...
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];
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.03.2011, 01:40     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #7
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 можете заглянуть.
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
22.03.2011, 12:40  [ТС]     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #8
Всем огромное спасибо!
извините, что достаю, но можно с коментами, потому что я некоторые моменты не до конца понимаю
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.03.2011, 14:44     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #9
kaffein, вы уж лучше скажите, что не понимаете.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.03.2011, 17:12     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #10
Я не вижу конструктора по умолчанию, т.е. нельзя просто vector vec.
А ведь он есть.) Но будет ошибка времени выполнения. Ибо, int m = new int[0] - низя.

Цитата Сообщение от bigredcat Посмотреть сообщение
По стандарту С++ в случае неудачи new генерирует std::bad_alloc
Это вообще весёлая тема, но я пруф не вспомню никак. Суть в том, что реальное выделение памяти происходит только при использовании, т.е. в большинстве случаев вообще невозможно узнать об ошибке выделения памяти, пока приложение не упадёт.
Александреску, кажется, или Саттер... не помню...
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:31     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #11
silent_1991
ты, конечно, тоже хорош. В функциях resize, erase память перевыделяешь каждый раз, хотя делать это надо лишь когда capacity изменился. Также повсюду дублирование кода: в вычислении capacity, копировании из массива в массив. В общем фэйл.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.03.2011, 17:35     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #12
slice, перепишите.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:38     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #13
silent_1991, мне больше заняться нечем
silent_1991
22.03.2011, 17:39
  #14

Не по теме:

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

slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:48     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #15
silent_1991
Чтож, по-крайней мере ты не отрицаешь, что твой аррэй сосет. Уже хорошо.
Между прочим, критика кода очень мощный стимул для роста программиста. Жаль, что ты это пока не осознал.
silent_1991
22.03.2011, 17:50
  #16

Не по теме:

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

slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:52     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вашу, например, стоило бы смыть в унитаз.
ага, вслед за вашим кодом
silent_1991
22.03.2011, 17:53
  #18

Не по теме:

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

slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:55     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор #19
silent_1991, договорились
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2011, 17:55     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Еще ссылки по теме:

C++ Реализовать конструктор копирования
C++ Cделать конструктор по умолчанию и копирования для класса
Деструктор и конструктор копирования не работают C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
22.03.2011, 17:55     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
  #20

Не по теме:

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

Yandex
Объявления
22.03.2011, 17:55     Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Ответ Создать тему
Опции темы

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