Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 83, средняя оценка - 4.93
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
#1

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

21.01.2012, 21:56. Просмотров 11281. Ответов 14
Метки нет (Все метки)

Доброго времени суток уважаемые форумчане.
Возникла проблема
Допустим у меня есть класс, в котором находится некий массив и нужно сделать так, чтобы работать с классом можно было как с массивом
Перегрузил оператор индексации, он работает правильно, необходимо сделать так, чтобы при присваивании выполнялось ещё определённое действие. Пробовал перегружать оператор присваивания.

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

Перегрузка оператора индексации - C++
Можно ли зоздать в своем классе перегрузку оператора , но с двойными скобками вроде? int &operator(int m,int n) { /*.....*/}

Перегрузка оператора индексации [] - C++
Имеется некоторый класс почти массив. "Почти" - потому что элементы лежат в памяти не по байтам, а по битам и, соответственно, для...

Перегрузка оператора индексации - C++
class matrix{ double **c; int m;//кол-во строк int n;//кол-во столбцов } - часть кода подскажите, пож-ста, как перегрузить ()...

Перегрузка оператора индексации - C++
Доброго вам времени суток, у меня появилась проблема з перезагузкой оператора индексации (),вот мой код: MyVectorClass.h #include...

Перегрузка оператора индексации [] - C++
Необходимо перегрузить оператор индексации двумя способами, первый я реализовал #pragma once #include <iostream> using namespace...

Перегрузка оператора индексации в списке - C++
Доброго времени суток. Имеется список, внутри которого соответственно структура, имеющая элемент данных int и две ссылки вперед/назад ...

14
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 22:04 #2
Deadik_Gudwin, покажите, как Вы перегрузили?
0
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
21.01.2012, 22:05 #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};
};
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.01.2012, 22:11 #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; }
0
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
21.01.2012, 22:16 #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;
}
0
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
21.01.2012, 22:22  [ТС] #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, оператор индексации у меня и так прекрасно работает, мне нужно оператор присваивания перегрузить, чтобы при присвоении дополнительные действия выполнялись
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 22:28 #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, перегружал следующим образом
Перегружать = не обязательно. Смотри.
0
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
21.01.2012, 22:34  [ТС] #8
go, я как обычно не сумел толком объяснить что требуется=(
Для присваивания значения массиву перегружать не надо, это я понял почти сразу, но мне нужно чтобы в момент присваивания, происходили ещё некоторые действия, помимо присваивания значения ячейке массива, как мне поступить?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 22:53 #9
Возможность перегрузки есть только для пользовательских типов/классов.

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

P.S. vector использовать нельзя, только самописное
0
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
21.01.2012, 23:37 #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;
}
3
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 23:41 #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/5dd6dada25b044ab3c7435ca4f20cdd3
1
Deadik_Gudwin
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 9
22.01.2012, 00:58  [ТС] #13
go,
Dekio, спасибо, немного переделал свой код основываясь на ваших примерах и всё нормально стало работать.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
02.02.2012, 11:28 #14
Цитата Сообщение от Dekio Посмотреть сообщение
protected:
Чем обусловлено использование именно этого модификатора доступа?
0
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
02.02.2012, 12:26 #15
Возможным подальшим наследием
0
02.02.2012, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2012, 12:26
Привет! Вот еще темы с ответами:

Перегрузка оператора индексации для связанного списка - C++
Доброго времени суток!:) Требуется перегрузить оператор индексации для связанного списка, я так понимаю в роли списка должны выступать...

Перегрузка оператора присваивания - C++
мне надо было реализовать конструкторы, деструктор, оператор присваивания, функции ввода / вывода объектов; кто сможет дописать...

Перегрузка оператора присваивания - C++
Добрый вечер. Есть задание: Нужно так перегрузить оператор =, чтобы можно было элементу одного класса, присваивать значение элемента...

Перегрузка оператора присваивания - C++
Доброго времени суток! Возник вопрос по поводу перегрузки оператора присваивания. Пример перегрузки по канону: class Integer { ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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