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

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

Войти
Регистрация
Восстановить пароль
 
 
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
#1

перегрузка [] - C++

01.02.2013, 15:07. Просмотров 734. Ответов 20
Метки нет (Все метки)

Как перегрузить operator[] так, чтобы когда я модифицировал массив то вызывалась простая версия, а когда просто выводил то const версия?

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
#ifndef array_h
#define array_h
 
template<typename T>
class Array {
public:
    Array();
    Array(int);
    ~Array();
    T &operator[](int);
protected:
    void add_new_elem(int);
    T* mElem;
    int mSize;
};
 
 
template<typename T>
Array<T>::Array()
{
    mSize = 1;
    mElem = new T[mSize];
}
 
template<typename T>
Array<T>::Array(int size)
{
    mSize = size;
    mElem = new T[mSize];
}
 
template<typename T>
Array<T>::~Array()
{
    delete [] mElem;
}
 
template<typename T>
void Array<T>::add_new_elem(int newSize)
{
    T* newElem = new T[newSize];
 
    for(int i=0;i<newSize;i++)
        newElem[i] = mElem[i];
 
    mSize = newSize;
    delete [] mElem;
    mElem = newElem;
}
 
template<typename T>
T &Array<T>::operator[](int x)
{
    if(x>=mSize)
        add_new_elem(x+1);
    return (mElem[x]);
}
 
 
#endif
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2013, 15:07     перегрузка []
Посмотрите здесь:

Перегрузка * - C++
Есть такой класс: class CMatrix{ valarray&lt;valarray&lt;double&gt; &gt; matrix; public: CMatrix operator* (const CMatrix &amp;M); }; ...

Перегрузка + - C++
#include &lt;iostream&gt; using namespace std; class loc { int n , m; public: loc() {} loc( int lg , lt) { n = lg; m =...

Перегрузка new - C++
Дайте примеры на перегрузку. #define n ... // Некая целая константа class a { ... }; // Некий класс a *p=new a; // Здесь должен быть...

Перегрузка - C++
Дали задачу, на перегрузку строк вот один из операторов который надо перегрузить. stringg&amp; operator+=( stringg a) { char...

Перегрузка в c++ - C++
Зачем нужно использовать перегрузку в c++? Этот вопрос будет у меня на экзамене, поэтому хочу услышать ваши версии

Перегрузка ++ и -- - C++
У меня было задание: Напишите программу работы со временем, в которой используются перегруженные операции ++ и --, которые работают в...

Перегрузка - C++
Класс - множество set. Дополнительно перегрузить следующие операции: -- удалить элемент из множества (типа set-item); * - пересечение...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 3
01.02.2013, 15:14     перегрузка [] #2
Две версии сделай:
C++
1
2
3
4
5
6
template<typename T>
class Array {
public:
    T & operator[](int);
    const T & operator[](int) const;
};
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
01.02.2013, 15:15  [ТС]     перегрузка [] #3
Я делал две версии, но вызывается чего-то только одна!
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 3
01.02.2013, 15:19     перегрузка [] #4
Цитата Сообщение от The_bolT Посмотреть сообщение
Я делал две версии, но вызывается чего-то только одна!
Константная версия будет вызываться только для константного объекта.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T>
void func1(Array<T> & Arr)
{
    T a = Arr[0]; // неконстантная версия
}
 
template <class T>
void func2(const Array<T> & Arr)
{
    T a = Arr[0]; // константная версия
}
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
01.02.2013, 15:42  [ТС]     перегрузка [] #5
я хочу реализовать проверку на выход за пределы массива, но тут возникла такая праблема: если будет вызываться одна и та функция [] то по сути в одну сторону можно проконтролировать а в другую нет, если i <0 еще нормально, а если i> size то тоже проконтролировать можно, но памяти под новые элементы не выделится больше никогда! Посоветуйте что-нибудь!
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.02.2013, 09:54     перегрузка [] #6
The_bolT, отдышитесь и сформулируйте свою мысль более понятно. Что у вас там в одну сторону контролируется, а в другую нет, и что там контролируется но не выделяется?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
04.02.2013, 15:37  [ТС]     перегрузка [] #7
В С + + не контролируется выход за границы массива, вот я и решил написать программу с динамическим массивом чтобы можно было контролировать это, например:
создали мы массив размером 5 и заполнили его числами, и я хочу, чтобы моя программа не допускала такого
arr [6] = 3;
чтобы на этом моменте вибиволо сообщения или выходило из программы.
Вот я и подумал написать две версии [] обна для модификации массива, а вторая, константная версия, только для чтения этого массива. Если не будет две версии, у меня получится фикссований массив, который после инициализации не сможет менять свой ​​размер. Я подумал написать что-то похоже к этому, но размер массива затем изменить нельзя.
C++
1
2
3
4
5
6
7
8
template<typename T>
T &Array<T>::operator[](int x)
{
    //if(x<0 && x>=size) exit(1);                        
    if(x>=mSize)
        add_new_elem(x+1);
    return (mElem[x]);
}
Добавлено через 35 минут
Решил сделать по другому, добавить функцию push_back чтобы добавлять элементы а в operator[] генерировать исключения, но почему я это исключение перехватить не могу?
Кликните здесь для просмотра всего текста
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
#ifndef array_h
#define array_h
 
 
template<typename T>
class Array {
public:
    Array();
    Array(int);
    ~Array();
    T &operator[](int) const;
    bool operator==(const Array<T>&);
    bool operator!=(const Array<T>&);
    void push_back(T);
    int size() const;
protected:
    void add_new_elem(int);
    T* mElem;
    int mSize;
};
 
template<typename T>
void Array<T>::push_back(T X)
{
    add_new_elem(mSize+1);
    mElem[mSize-1] = X;
}
 
template<typename T>
bool Array<T>::operator!=(const Array<T>& obj)
{
    if(mSize!=obj.mSize){
        return true;}
 
        for(int i=0;i<mSize;i++)
            if(mElem[i] != obj.mElem[i]) return true;
     return false;
}
 
template<typename T>
bool Array<T>::operator==(const Array<T>& obj)
{
    if(mSize!=obj.mSize){
        return false;}
 
        for(int i=0;i<mSize;i++)
            if(mElem[i] != obj.mElem[i]) return false;
     return true;
}
 
template<typename T>
int Array<T>::size() const
{
    return (mSize);
}
 
template<typename T>
Array<T>::Array()
{
    mSize = 1;
    mElem = new T[mSize];
}
 
template<typename T>
Array<T>::Array(int size)
{
    mSize = size;
    mElem = new T[mSize];
}
 
template<typename T>
Array<T>::~Array()
{
    delete [] mElem;
}
 
template<typename T>
void Array<T>::add_new_elem(int newSize)
{
    T* newElem = new T[newSize];
 
    for(int i=0;i<newSize;i++)
        newElem[i] = mElem[i];
 
    mSize = newSize;
    delete [] mElem;
    mElem = newElem;
}
 
template<typename T>
T &Array<T>::operator[](int x) const
{
    if(x >= mSize || x < 0){ 
        string e = "Error";
        throw invalid_argument(e);}
    return (mElem[x]);
}
 
 
#endif

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include "array.h"
 
using namespace std;
 
int main()
{
    Array<int> arr,arr2;
    for(int i=0;i<8;i++){
        arr[i]=i+1;
    }
    cout<<endl<<arr.size()<<endl<<endl;
    for(int i=0;i<arr.size();i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    try{
    arr[9] = 5;
    }
    catch(...)
    {cout<<"adw";
    }
    cout<<endl;
    system("pause>0");
    return 0;
}
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.02.2013, 16:24     перегрузка [] #8
The_bolT, ну вот, теперь совсем другое дело, теперь ясно, чего вы хотели.

Цитата Сообщение от The_bolT Посмотреть сообщение
но почему я это исключение перехватить не могу?
Потому что вы его и не ловите. Исключение происходит не там, где вы предполагаете, в блоке try, а раньше, в строке 10, на первой же итерации цикла. Ведь вы сами сказали, что добавили метод push_back для добавления элемента, но всё равно пытаетесь использовать для этого оператор индексации.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
04.02.2013, 16:39  [ТС]     перегрузка [] #9
Теперь появилась другая проблема, массив имеет один элемент больше чем я задаю, и я не могу найти где добавляется лишняя единица!
Кликните здесь для просмотра всего текста
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
#ifndef array_h
#define array_h
 
 
template<typename T>
class Array {
public:
    Array();
    Array(int);
    ~Array();
    T &operator[](int) const;
    bool operator==(const Array<T>&);
    bool operator!=(const Array<T>&);
    void push_back(T);
    int size() const;
protected:
    void add_new_elem(int);
    T* mElem;
    int mSize;
};
 
template<typename T>
void Array<T>::push_back(T X)
{
    add_new_elem(mSize+1);
    mElem[mSize-1] = X;
}
 
template<typename T>
bool Array<T>::operator!=(const Array<T>& obj)
{
    if(mSize!=obj.mSize){
        return true;}
 
        for(int i=0;i<mSize;i++)
            if(mElem[i] != obj.mElem[i]) return true;
     return false;
}
 
template<typename T>
bool Array<T>::operator==(const Array<T>& obj)
{
    if(mSize!=obj.mSize){
        return false;}
 
        for(int i=0;i<mSize;i++)
            if(mElem[i] != obj.mElem[i]) return false;
     return true;
}
 
template<typename T>
int Array<T>::size() const
{
    return (mSize);
}
 
template<typename T>
Array<T>::Array()
{
    mSize = 1;
    mElem = new T[mSize];
}
 
template<typename T>
Array<T>::Array(int size)
{
    mSize = size;
    mElem = new T[mSize];
}
 
template<typename T>
Array<T>::~Array()
{
    delete [] mElem;
}
 
template<typename T>
void Array<T>::add_new_elem(int newSize)
{
    T* newElem = new T[newSize];
 
    for(int i=0;i<newSize;i++)
        newElem[i] = mElem[i];
 
    mSize = newSize;
    delete [] mElem;
    mElem = newElem;
}
 
template<typename T>
T &Array<T>::operator[](int x) const
{
    /*if(x >= mSize || x < 0){ 
        string e = "Error";
        throw invalid_argument(e);
    }*/
    return (mElem[x]);
}
 
 
#endif

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include "array.h"
 
using namespace std;
 
int main()
{
    Array<int> arr,arr2;
    for(int i=0;i<8;i++){
        arr.push_back(i+1);
    }
    cout<<endl<<arr.size()<<endl<<endl;
    for(int i=0;i<arr.size();i++)
        cout<<arr[i]<<" ";
    
    system("pause>0");
    return 0;
}
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.02.2013, 16:45     перегрузка [] #10
The_bolT, в конструкторе же. Вы изначально выделяете массив из одного элемента. Последующие push_back добавляют элементы, не учитывая, что один уже добавлен в конструкторе (логически его быть не должно, конструктор должен создавать "пустой" массив).
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
04.02.2013, 16:54  [ТС]     перегрузка [] #11
Правда в конструкторе. Теперь все работает как я хотел! Большое спасибо!
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
04.02.2013, 16:59     перегрузка [] #12
класс vector вроде целиком и полностью сабж реализует
silent_1991
04.02.2013, 17:00
  #13

Не по теме:

alexpac26, я бы даже сказал, сверх того реализует. Только если не писать велосипеды, не спотыкаться на очевидных и не очень граблях - как тогда чему-нибудь научиться?

alexpac26
04.02.2013, 17:19
  #14

Не по теме:

ну велосипеды можно и более интересные придумать....

silent_1991
04.02.2013, 17:47
  #15

Не по теме:

alexpac26, когда я писал свой первый Vector, мне было интересно. А уж как за List принялся...

alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
04.02.2013, 21:41     перегрузка [] #16
да что там лист, тотже вектор тока
C++
1
#define mylist vector<string>
где mylist макрос-тип
silent_1991
05.02.2013, 07:52
  #17

Не по теме:

alexpac26, макросы в плюсах не кошерно. typedef достаточно.

The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
05.02.2013, 20:07  [ТС]     перегрузка [] #18
Не хочу создавать другую тему, так как это и по сей теме относится) Хочу перегрузить операторы <,>, <=,> = но не знаю как корректно сделать сравнение массивов. Может подскажете как?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
05.02.2013, 20:17     перегрузка [] #19
The_bolT, представьте, что массив - это число, каждый элемент которого - цифра в некоторой системе счисления, и подумайте, как сравниваются обычные числа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2013, 20:26     перегрузка []
Еще ссылки по теме:

Перегрузка [][] - C++
Возможно ли для данного класса обеспечить перегрузку жвойных скобок с тем, чтобы в программе можно было использовать выражения типа: ...

перегрузка [] - C++
доброго времени суток.. суть задачи такова: есть класс матриц, матрица хранится в виде одномерного массива.. я перегрузил &lt;&lt; и += ...

Перегрузка - C++
Написать программу на языке C++, реализующию перегруженную функцию z_cnt, получа- ющую в качестве аргумента или массив целых чисел, или...

перегрузка [] - C++
Здравствуйте! код из учебного пособия. (возможно немного не рабочий) текст перед кодом- &quot;Пусть класс определен как строка символов....

Перегрузка () - C++
Здарвствуйте, помогите с задачей: Имеется класс, создающий двумерный массив, в этом классе нужно реальзовать метод перегружающий () для...


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

Или воспользуйтесь поиском по форуму:
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
05.02.2013, 20:26  [ТС]     перегрузка [] #20
silent_1991, Я еще больше вдумуюся в вашу фразу, тем больше боюсь) Можно как-то по конкретнее написать, что вы этим имели в виду?)
Yandex
Объявления
05.02.2013, 20:26     перегрузка []
Ответ Создать тему
Опции темы

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