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

Класс массив - C++

Восстановить пароль Регистрация
 
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
14.09.2011, 22:37     Класс массив #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
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 "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
 
template <typename X> class Array
{
    int size;
    X *arr;
public:
    Array();
    Array(int);
    void set(int);
    int getsize() const {return size;};
    friend ostream &operator<<(ostream &,const Array<X> &);
    friend istream &operator>>(istream &,const Array<X> &);
    int operator[](int i);
    bool operator==(const Array &);
    bool operator!=(const Array &);
    Array operator+(const Array &);
};
template <typename X> Array<X>::Array()
{
    
    size = 1;
    arr = new int [size];
    for(int i=0;i<size;i++)
    {
        arr[i]=0;
    };
};
template <typename X> Array<X>::Array(int n)
{
    size = n;
    arr = new int [size];
    for(int i=0;i<size;i++)
    {
        arr[i]=0;
    };
};
template <typename X> int Array<X>::operator[](int i)
{
    if(i<0 || i>size) cout<<"Vihod za granici"<<endl;
 
    else return arr[i];
};
 
template <typename X> bool Array<X>::operator==(const Array<X> &o)
{
    return (size==o.size);
};
 
template <typename X> bool Array<X>::operator!=(const Array<X> &o)
{
    return (size!=o.size);
};
 
template <typename X> Array<X> Array<X>::operator+(const Array<X> &o)
{
    Array <X> temp;
    temp.size = size + o.size;
    temp.arr = new int [temp.size];
    for(int i=0;i<size;i++)
    {
        temp.arr[i]=arr[i];
 
    };
    for(int i=0, k=size;i<o.size, k<temp.size;i++,k++)
    {
        temp.arr[k]=o.arr[i];
    };
    return temp;
 
};
template <typename X> ostream &operator<<(ostream &stream,const Array<X> &o)
{
    for(int i=0;i<o.size;i++)
    {
        stream<<o.arr[i]<<" ";
    }
    return stream;
};
 
template <typename X> istream &operator>>(istream &stream,const Array<X> &o)
{
    for(int i=0;i<o.size;i++)
    {
        stream>>o.arr[i];
    };
return stream;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Array <int> a(2),b(3),d(2),c;
 
    cin>>a>>b>>d;
    c=(a+b)+d;
    if(a==b)cout<<"a=b";
    else cout<<"!="<<endl;
    
    cout<<c;
    system("pause");
    return 0;
}
Накропал я этот класс. Но вот проблема: что-то жалуется на перегруженные операторы "<<" и ">>".
Сразу писал этот класс как не шаблонный, проблем не было, всё отлично работало. А вот с шаблонами не катит почему-то. Просьба помочь разобраться.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Zverit
Уничтожитель печенек
 Аватар для Zverit
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
14.09.2011, 22:54     Класс массив #2
Замените 16, 17 строки на
C++
1
2
template<X> friend ostream &operator<<(ostream &,const Array<X> &);
template<X>  friend istream &operator>>(istream &,const Array<X> &);
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.09.2011, 22:56     Класс массив #3
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
#include <iostream>
#include <fstream>
using namespace std;
 
template< typename T >
class Array;
 
template< typename T >
ostream &operator<<(ostream &,const Array<T> &);
 
template< typename T >
istream &operator>>(istream &,Array<T> &);
 
template <typename X> class Array
{
        int size;
        X *arr;
public:
        Array();
        Array(int);
        void set(int);
        int getsize() const {return size;};
        friend ostream &operator<<< X >(ostream &,const Array<X> &);
        friend istream &operator>>< X >(istream &,Array<X> &);
        int operator[](int i);
        bool operator==(const Array &);
        bool operator!=(const Array &);
        Array operator+(const Array &);
};
template <typename X> Array<X>::Array()
{
        
        size = 1;
        arr = new int [size];
        for(int i=0;i<size;i++)
        {
                arr[i]=0;
        };
};
template <typename X> Array<X>::Array(int n)
{
        size = n;
        arr = new int [size];
        for(int i=0;i<size;i++)
        {
                arr[i]=0;
        };
};
template <typename X> int Array<X>::operator[](int i)
{
        if(i<0 || i>size) cout<<"Vihod za granici"<<endl;
 
        else return arr[i];
};
 
template <typename X> bool Array<X>::operator==(const Array<X> &o)
{
        return (size==o.size);
};
 
template <typename X> bool Array<X>::operator!=(const Array<X> &o)
{
        return (size!=o.size);
};
 
template <typename X> Array<X> Array<X>::operator+(const Array<X> &o)
{
        Array <X> temp;
        temp.size = size + o.size;
        temp.arr = new int [temp.size];
        for(int i=0;i<size;i++)
        {
                temp.arr[i]=arr[i];
 
        };
        for(int i=0, k=size;i<o.size, k<temp.size;i++,k++)
        {
                temp.arr[k]=o.arr[i];
        };
        return temp;
 
};
template <typename X> ostream &operator<<(ostream &stream,const Array<X> &o)
{
        for(int i=0;i<o.size;i++)
        {
                stream<<o.arr[i]<<" ";
        }
        return stream;
};
 
template <typename X> istream &operator>>(istream &stream,Array<X> &o)
{
        for(int i=0;i<o.size;i++)
        {
                stream>>o.arr[i];
        };
return stream;
};
 
int main()
{
        Array <int> a(2),b(3),d(2),c;
 
        cin>>a>>b>>d;
        c=(a+b)+d;
        if(a==b)cout<<"a=b";
        else cout<<"!="<<endl;
        
        cout<<c;
        system("pause");
        return 0;
}
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
14.09.2011, 23:05  [ТС]     Класс массив #4
ITZver, не проходит, теперь выдаёт ошибки, что невозможно обратиться к private члену.

Добавлено через 4 минуты
silent_1991, и так не работает, но теперь ругается только на оператор >>.

Upd: нет, работает, спасибо. Не могли бы Вы объяснить почему нужно делать именно так?
В случае с friend istream &operator>>< X >(istream &,Array<X> &); этой строкой я понял почему, а вот зачем делать сразу вот это?
C++
1
2
3
4
5
6
7
8
template< typename X >
class Array;
 
template< typename X >
ostream &operator<<(ostream &,const Array<X> &);
 
template< typename X >
istream &operator>>(istream &,Array<X> &);
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.09.2011, 23:08     Класс массив #5
Sick2, не знаю, что у вас там не работает. в 2010 студии всё прекрасно компилируется и работает. Вы точно скопировали весь код? Там везде у вас в операторе >> const для ссылки на объект класса был расставлен, я его везде убрал.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.09.2011, 23:10     Класс массив #6
Цитата Сообщение от Sick2 Посмотреть сообщение
int operator[](int i);
C++
1
int& operator[](int i);
и добавь перегрузку для константных объектов
C++
1
const int& operator[](int i) const;
Добавлено через 1 минуту
Цитата Сообщение от Sick2 Посмотреть сообщение
template <typename X> int Array<X>::operator[](int i)
{
if(i<0 || i>size) cout<<"Vihod za granici"<<endl;
else return arr[i];
};
Это не проверка на ошибку... В таких случаях бросают исключение.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
15.09.2011, 00:22  [ТС]     Класс массив #7
Цитата Сообщение от rangerx Посмотреть сообщение
C++
1
int& operator[](int i);
и добавь перегрузку для константных объектов
C++
1
const int& operator[](int i) const;
Добавлено через 1 минуту

Это не проверка на ошибку... В таких случаях бросают исключение.
Cпасибо, но я ещё это не прошёл так сказать) Решил оставить на потом.

Добавлено через 1 час 7 минут
Ба...в общем при прочтении задания полностью,выяснил что там нужно ещё определить пользовательский тип. У меня этот тип стек. Я пока не очень представляю, что это будет. Массив стеков...
У меня вопрос: нужно ли чего менять в этом коде, для реализации такого массива?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
15.09.2011, 01:20     Класс массив #8
Цитата Сообщение от Sick2 Посмотреть сообщение
У меня вопрос: нужно ли чего менять в этом коде, для реализации такого массива?
Ничего менять не нужно, разумеется кроме явных ошибок. Например, почему ты выделяешь память для int
C++
1
arr = new int [size];
в то время как твой массив хранит элементы типа X? То же самое касается и возвращаемого значения функции operator[].

Добавлено через 4 минуты
А вообще, ошибок в коде немало. В частности не реализованы конструктор копий и оператор присваивания.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.09.2011, 01:30     Класс массив #9
вектор без аллокатора
vector.hpp
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
#include <algorithm>
#include <stdexcept>
#include <iostream>
#include <iterator>
#include <cstddef>
#include <cstring>
 
namespace my {
 
    template< class Type >
    class vector {
    public:
        
        typedef Type            value_type;
        typedef Type*           iterator;
        typedef const Type*     const_iterator;
        typedef Type&           reference;
        typedef const Type&     const_reference;
        typedef std::size_t     size_type;
 
        explicit vector(size_type size = 0) : size_(size), arr(0)
        {
            this->capacity_ = (size == 0) ? 32 : size + size / 2 + 1;
            this->arr = new value_type [capacity_]();
        }
 
        vector(const vector& other)
        {
            this->size_ = other.size_;
            this->capacity_ = other.size_;
            this->arr = new Type [capacity_]();
            std::memcpy(this->arr, other.arr, this->size_ * sizeof(value_type));
        }
        
        ~vector()
        {
            delete [] this->arr;
        }
 
        vector& operator = (const vector& other)
        {
            if (&other != this)
                vector(other).swap(*this);
            return *this;
        }
 
        iterator begin()
        {
            return this->arr;
        }
 
        const_iterator begin() const
        {
            return this->arr;
        }
 
        iterator end()
        {
            return this->arr + size_;
        }
 
        const_iterator end() const
        {
            return this->arr + size_;
        }
 
        void swap(vector & other) throw()
        {
            std::swap(this->size_, other.size_);
            std::swap(this->capacity_, other.capacity_);
            std::swap(this->arr, other.arr);
        }
 
        size_type size() const
        {
            return this->size_;
        }
 
        size_type capacity() const
        {
            return this->capacity_;
        }
 
        reference operator [] (size_type i)
        {
        #if DEBUG_
            if (i >= this->size_)
                throw std::out_of_range("out of range throwed");
        #endif
            return this->arr[i];
        }
 
        const_reference operator [] (size_type i) const
        {
        #if DEBUG_
            if (i >= this->size_)
                throw std::out_of_range("out of range throwed");
        #endif
            return this->arr[i];
        }
 
        reference at(size_type i)
        {
            if (i < size_)
                return this->arr[i];
            else
                throw std::out_of_range("out of range throwed");
        }
 
        const_reference at(size_type i) const
        {
            if (i < size_)
                return this->arr[i];
            else
                throw std::out_of_range("out of range throwed");
        }
 
        void push_back(const_reference value)
        {
            if (this->size_ == this->capacity_)
            {
                this->capacity_ += this->size_ / 2 + 1;
                iterator iter = new value_type [capacity_]();
                std::memmove(iter, this->arr, this->size_ * sizeof(value_type));
                delete [] this->arr;
                this->arr = iter;
            }
 
            this->arr[size_++] = value;
        }
 
    private:
        template< class OtherType >
        vector(const vector< OtherType >&);
 
        template< class OtherType >
        vector& operator = (const vector< OtherType >&);
    private:
        iterator    arr;
        size_type   size_;
        size_type   capacity_;
    };
}

долго не отлаживал, возможно есть и ошибки
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
15.09.2011, 01:39  [ТС]     Класс массив #10
Цитата Сообщение от rangerx Посмотреть сообщение
Ничего менять не нужно, разумеется кроме явных ошибок. Например, почему ты выделяешь память для int
C++
1
arr = new int [size];
в то время как твой массив хранит элементы типа X? То же самое касается и возвращаемого значения функции operator[].

Добавлено через 4 минуты
А вообще, ошибок в коде немало. В частности не реализованы конструктор копий и оператор присваивания.
Первую ошибку я исправил, когда создавал шаблон типа double)
Ну...я это не реализовывал потому как в задании это не указано
Не могли бы Вы назвать ещё ошибки? Мне очень интересно)

Добавлено через 2 минуты
Jupiter, благодарю за код, но в этой работе не разрешается использовать сторонние библиотеки)
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.09.2011, 01:41     Класс массив #11
Цитата Сообщение от Sick2 Посмотреть сообщение
Jupiter, благодарю за код, но в этой работе не разрешается использовать сторонние библиотеки)
для начала присмотрись где и что используется, и напиши собственные альтернативы, важен сам принцип построения такого класса, а не его реализация
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2011, 23:09     Класс массив
Еще ссылки по теме:

опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) C++
Класс-массив C++
C++ Класс "Телефонная станция". Массив символов и массив строк - в чем разница?

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
15.09.2011, 23:09     Класс массив #12
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну...я это не реализовывал потому как в задании это не указано
И тем не менее, в 99-ой строке ты это использовал ) Либо реализуй их, либо спрячь прототипы этих функций в секцию private:
C++
1
2
3
4
5
//...
private:
    Array(const Array& rhs);
    Array& operator=(const Array& rhs);
//...
и оставь без реализации. Тем самым ты запретишь возможность их использования.
Цитата Сообщение от Sick2 Посмотреть сообщение
Не могли бы Вы назвать ещё ошибки? Мне очень интересно)
1) для индексации и размера массива лучше использовать std::size_t вместо int;
2) конструктор по умолчнию здесь лишний, достаточно было сделать для конструктора с параметром параметр по умолчнию
C++
1
Array(std::size_t n = 1);
3) чтобы избежать неявных преобразований правильнее было бы записать конструктор используя ключевое слово explicit
C++
1
explicit Array(std::size_t n = 1);
4) цикл для инициализации массива можно не использовать, достаточно сделать
C++
1
arr = new X [size]();
5) ты используешь функцию system из <cstdlib>, но этот заголовок у тебя не подключён. Всегда следует подключать все заголовочные файлы функции из которых используешь.
Yandex
Объявления
15.09.2011, 23:09     Класс массив
Ответ Создать тему
Опции темы

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