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

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

Войти
Регистрация
Восстановить пароль
 
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
#1

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

14.09.2011, 22:37. Просмотров 975. Ответов 11
Метки нет (Все метки)

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

Класс домов и класс улиц для учета поступлений квартплаты. Массив - C++
Задание: вырезано Файл StdAfx.h #pragma once #include &quot;targetver.h&quot; #include &lt;stdio.h&gt;

Создать Класс Coins (монеты). Класс сохраняет массив из 3 монет ... - C++
Помогите написать програмку, где: Нужно создать Класс Coins (монеты). Класс сохраняет массив из 3 монет и общее количество лицевых сторон...

Шаблонный класс и класс одномерный массив - C++
Задание: протестировать класс шаблон, с обычными типами данных я понял как делать, а как передать в шаблон свой класс я не понял. ...

Класс "Динамический массив точек", в котором лежит класс Point - C++
Такое вот условаие. Не могу понять что от меня хотят. Может кто или обьяснить или дать пример решения. (лучше просто объяснить). ...

Описать класс Массив, найти массив, состоящий из элементов первого и второго массива - C++
Процедура по поиску такого массива работает, но после нее меняются элементы первого массива. И еще вопрос - как в конце программы...

опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) - C++
Здравствуйте! Есть задача... вкратце. Нужно создать массив указателей по выборке животных участвующих в забеге. Это Лошадь, Крокодил,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
14.09.2011, 23:08 #5
Sick2, не знаю, что у вас там не работает. в 2010 студии всё прекрасно компилируется и работает. Вы точно скопировали весь код? Там везде у вас в операторе >> const для ссылки на объект класса был расставлен, я его везде убрал.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
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
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
15.09.2011, 01:20 #8
Цитата Сообщение от Sick2 Посмотреть сообщение
У меня вопрос: нужно ли чего менять в этом коде, для реализации такого массива?
Ничего менять не нужно, разумеется кроме явных ошибок. Например, почему ты выделяешь память для int
C++
1
arr = new int [size];
в то время как твой массив хранит элементы типа X? То же самое касается и возвращаемого значения функции operator[].

Добавлено через 4 минуты
А вообще, ошибок в коде немало. В частности не реализованы конструктор копий и оператор присваивания.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.09.2011, 01:41 #11
Цитата Сообщение от Sick2 Посмотреть сообщение
Jupiter, благодарю за код, но в этой работе не разрешается использовать сторонние библиотеки)
для начала присмотрись где и что используется, и напиши собственные альтернативы, важен сам принцип построения такого класса, а не его реализация
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
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>, но этот заголовок у тебя не подключён. Всегда следует подключать все заголовочные файлы функции из которых используешь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2011, 23:09
Привет! Вот еще темы с ответами:

Написать класс Матрица. Массив объектов класса Массив - C++
Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего задания). В классе реализовать следующие...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс "Телефонная станция". Массив символов и массив строк - в чем разница? - C++
Всем привет. Не могу исправить в программе пункт корректировки. Весь проект прикрепляю к сообщению. ...

Создать базовый класс "Массив" и класс-наследник "Матрица" - C++
Добрый день! такой вопрос, как задать двумерный массив и заполнить его рандомными числами. и как его реализовать используя абстрактные...


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

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

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