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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.68
kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
#1

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

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

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

Класс "Матрица": конструктор, деструктор и перегрузка операторов - C++
Матрица – KMatrix Методы: конструкторы, деструктор; операции: , =, ==, !=,...

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

Для структуры "Дата" реализовать конструктор по умолчанию, выводящий текущую дату - C++
Преподаватель дал задние,чтобы в структуре Date был конструктор по умолчанию.который выводит текущую дату.сказал что для этого туда надо...

Описать класс "полином" - Для чего нужен конструктор по умолчанию? - C++
неоюходимо написать класс для работы с полиномами в нете нашел что-то поожее может кто-нибудь объяснить для чего нужен конструктор по...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
bigredcat
365 / 312 / 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
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
21.03.2011, 21:46  [ТС] #3
да, не спорю, я тут затупил!
а по остальним заданиям кто - нибудь может ответить ?
bigredcat
365 / 312 / 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
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
22.03.2011, 00:19  [ТС] #5
Мда..... ну я тут наворотил
дело в том что нам это почти не объясняли.......
не могли бы вы показать как это нужно правильно сделать ?
потому что без этого я не смогу продолжить свою роботу
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
22.03.2011, 12:40  [ТС] #8
Всем огромное спасибо!
извините, что достаю, но можно с коментами, потому что я некоторые моменты не до конца понимаю
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
22.03.2011, 14:44 #9
kaffein, вы уж лучше скажите, что не понимаете.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:31 #11
silent_1991
ты, конечно, тоже хорош. В функциях resize, erase память перевыделяешь каждый раз, хотя делать это надо лишь когда capacity изменился. Также повсюду дублирование кода: в вычислении capacity, копировании из массива в массив. В общем фэйл.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
22.03.2011, 17:35 #12
slice, перепишите.
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:38 #13
silent_1991, мне больше заняться нечем
silent_1991
22.03.2011, 17:39
  #14

Не по теме:

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

slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 17:48 #15
silent_1991
Чтож, по-крайней мере ты не отрицаешь, что твой аррэй сосет. Уже хорошо.
Между прочим, критика кода очень мощный стимул для роста программиста. Жаль, что ты это пока не осознал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2011, 17:48
Привет! Вот еще темы с ответами:

Создать конструктор копирования для класса "Прямоугольник" - C++
Всем привет! Помогите разобраться, пожалуйста! Есть такое задание: Определить класс &quot;прямоугольник&quot;. Высчитать его...

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

Разработать класс Airplane (самолет). Определить конструктор и деструктор. Реализовать объявленные методы доступа к данным. - C++
решите пожалуйста вот эту задачу, вроде бы простая.. и если можно объясните, что где что значит. (С++) Разработать класс Airplane...

Деструктор и конструктор копирования не работают - C++
Если котротко, то проблему можнео описать в двух словах: не могу написать деструктор и конструктор копирования к классу Матрица. ...


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

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

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