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

Перегрузка оператора индексации и присваивания (C++) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 83, средняя оценка - 4.93
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
21.01.2012, 21:56     Перегрузка оператора индексации и присваивания (C++) #1
Доброго времени суток уважаемые форумчане.
Возникла проблема
Допустим у меня есть класс, в котором находится некий массив и нужно сделать так, чтобы работать с классом можно было как с массивом
Перегрузил оператор индексации, он работает правильно, необходимо сделать так, чтобы при присваивании выполнялось ещё определённое действие. Пробовал перегружать оператор присваивания.

C++
1
2
3
myClass object(5);//Работает как массив из 5 ячеек
 
object[2]=132; //Работает оператор индексирования, но в код перегруженного оператора присваивания                   //даже не заходит
Если что нужно ещё добавить из инфы, то добавлю
Вопрос всёже как сделать чтобы в конструкции myobject[n]=x выполнялся и перегруженный [] и =
Заранее спасибо
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 21:56     Перегрузка оператора индексации и присваивания (C++)
Посмотрите здесь:

Перегрузка оператора индексации [] C++
C++ Перегрузка оператора присваивания
Перегрузка оператора индексации [] C++
Перегрузка оператора индексации C++
Перегрузка оператора индексации для связанного списка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 22:04     Перегрузка оператора индексации и присваивания (C++) #2
Deadik_Gudwin, покажите, как Вы перегрузили?
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
21.01.2012, 22:05     Перегрузка оператора индексации и присваивания (C++) #3
C++
1
2
3
4
5
6
7
8
9
10
class M
{
private:
   int*massiv;
public:
friend void operator[](int b) { massiv = new int [b]};
 
//В деструкторе:
~M(){delete [] massiv};
};
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
21.01.2012, 22:11     Перегрузка оператора индексации и присваивания (C++) #4
нечто вроде

C++
1
2
3
4
Reference myClass::operator[](int index){ return Reference(this, index); }
Reference::Reference(myClass* ptr, int index) : m_ptr(ptr), m_index(index) {}
Reference::operator int() const { return m_ptr->get(m_index); }
Reference& ::operator=(int val) { m_ptr->set(m_index, val); return *this; }
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
21.01.2012, 22:16     Перегрузка оператора индексации и присваивания (C++) #5
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
#include <iostream>
 
class Foo
{
    public:
        Foo(int num = 1)
        {
            arr = new int[num];    
        }
        ~Foo()
        {
            delete arr;
        }
        int &operator [](int idx)
        {
            return arr[idx];
        }
    protected:
        int *arr;
};
 
 
int main()
{
    Foo obj(3);
    obj[2] = 10;
    std::cout<<obj[2]<<std::endl;
    system("pause");
    return 0;
}
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
21.01.2012, 22:22  [ТС]     Перегрузка оператора индексации и присваивания (C++) #6
go, перегружал следующим образом

C++
1
2
3
4
5
6
7
8
9
10
int operator =(int Value)
{
    //...тело метода...
    return Value;
}
 
int& operator [](int Index)
{
        return Array[Index];
}
Добавлено через 2 минуты
Dekio, оператор индексации у меня и так прекрасно работает, мне нужно оператор присваивания перегрузить, чтобы при присвоении дополнительные действия выполнялись
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 22:28     Перегрузка оператора индексации и присваивания (C++) #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class obj {
private:
    int *arr;
public:
    obj (size_t size = 1) { arr = new int [size]; }
    ~obj () { delete []arr; }
    int& operator[] (size_t i) { return arr[i]; }
};
int main()
{
    obj cl(5);
    cl[1] = 10;
    std::cout << cl[1] << std::endl;
 
    return 0;
}
Добавлено через 30 секунд
Цитата Сообщение от Deadik_Gudwin Посмотреть сообщение
go, перегружал следующим образом
Перегружать = не обязательно. Смотри.
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
21.01.2012, 22:34  [ТС]     Перегрузка оператора индексации и присваивания (C++) #8
go, я как обычно не сумел толком объяснить что требуется=(
Для присваивания значения массиву перегружать не надо, это я понял почти сразу, но мне нужно чтобы в момент присваивания, происходили ещё некоторые действия, помимо присваивания значения ячейке массива, как мне поступить?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 22:53     Перегрузка оператора индексации и присваивания (C++) #9
Возможность перегрузки есть только для пользовательских типов/классов.

Цитата Сообщение от Deadik_Gudwin Посмотреть сообщение
но мне нужно чтобы в момент присваивания, происходили ещё некоторые действия
Вы хотите перегрузить для типа int? Но так же нельзя? Или я Вас не понимаю. Какое задание, что должно происходить? Здесь необходимо ухитриться, так как... (Я уже написал выше)
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
21.01.2012, 23:11  [ТС]     Перегрузка оператора индексации и присваивания (C++) #10
go, то что нужно ухитриться я уже понял=)
Попробую объяснить.
Есть класс, допустим его зовут myClass.
Он содержит в себе массив, например myArray.
Есть некоторая переменная, которая содержит в себе текущую длину массива, допустим Length.
размер массива указывается в конструкторе, при создании класса (это сделано).
Создаём объект Array Array1(5). В качестве входного параметра длина массива.
Далее при работе пользуемся перегруженным оператором [].
А вот теперь то что мне требуется: Если мы пытаемся присвоить значение элементу с индексом, который больше чем длинна массива, то размер массива увеличился до этого индекса, и этому элементу было бы присвоено значение.
Соответственно нужно чтобы в таком случае выполнился код, который копирует данные во вспомогательный массив, объявляет нужный заново, но уже с новой длиной и переносит туда значения из вспомогательного массива, а потом присваивает последнему элементу значение.
Вот как сделать чтобы в данном случае код выполнился, который увеличит длину массива? Сам код увеличения есть.

P.S. vector использовать нельзя, только самописное
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
21.01.2012, 23:37     Перегрузка оператора индексации и присваивания (C++) #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
zum Beispiel
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
#include <iostream>
 
class Foo
{
    public:
        Foo(int num = 1)
        {
            CurSize = num;
            arr = new int[CurSize];    
        }
        ~Foo()
        {
            delete []arr;
        }
        int &operator [](int idx)
        {
            if(idx > CurSize)
            {
                temp = new int [CurSize];
                for(int i = 0; i < CurSize; i++)
                    temp[i] = arr[i];
                arr = new int[idx];
                for(int i = 0; i < CurSize; i++)
                    arr[i] = temp[i];
                delete []temp;
                CurSize = idx;
            }
            return arr[idx];
        }
    protected:
        int CurSize, *arr, *temp;
}; 
 
int main()
{
    Foo obj(3);
    obj[2] = 8;
    obj[5] = 10; // 5 > 3
    std::cout<<obj[2]<<" "<<obj[5]<<std::endl;
    system("pause");
    return 0;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 23:41     Перегрузка оператора индексации и присваивания (C++) #12
Deadik_Gudwin, вот, то что Вам нужно. (вместо комментариев, всунете то что надо)
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
#include <iostream>
 
class obj {
private:
        int *arr;
        size_t index;
        size_t sz;
public:
        obj (size_t size = 1) : index(0), sz(size) { arr = new int [size]; }
        ~obj () { delete []arr; }
        obj& operator[] (size_t i) {
            index = i;
            return *this;
        }
        obj& operator= (size_t val) {
            if ( val < sz )
                arr[index] = val;
            else {
            /* выполняем, что необходимо */
 
            }
            return *this;
        }
        friend std::ostream& operator<< (std::ostream& , const obj& );
};
 
std::ostream& operator <<(std::ostream& os, const obj& cl)
{
    os <<   cl.arr[cl.index] << std::endl;
    return os;
}
 
int main()
{
        obj cl(5);
        cl[1] = 2;
        std::cout << cl[1] << std::endl;
 
        return 0;
}
http://liveworkspace.org/code/5dd6da...7435ca4f20cdd3
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
22.01.2012, 00:58  [ТС]     Перегрузка оператора индексации и присваивания (C++) #13
go,
Dekio, спасибо, немного переделал свой код основываясь на ваших примерах и всё нормально стало работать.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
02.02.2012, 11:28     Перегрузка оператора индексации и присваивания (C++) #14
Цитата Сообщение от Dekio Посмотреть сообщение
protected:
Чем обусловлено использование именно этого модификатора доступа?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2012, 12:26     Перегрузка оператора индексации и присваивания (C++)
Еще ссылки по теме:

перегрузка оператора индексации в списке C++
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания

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

Или воспользуйтесь поиском по форуму:
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
02.02.2012, 12:26     Перегрузка оператора индексации и присваивания (C++) #15
Возможным подальшим наследием
Yandex
Объявления
02.02.2012, 12:26     Перегрузка оператора индексации и присваивания (C++)
Ответ Создать тему
Опции темы

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