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

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

Войти
Регистрация
Восстановить пароль
 
 
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

31.08.2013, 15:32. Просмотров 984. Ответов 24
Метки нет (Все метки)

Здорова господа!!!

Как перегрузить operator[][] для класса или 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
#include <iostream>
using std::cout;
using std::endl;
 
class cl
{
    int mass[3][3];
    int kkk;
public:
    cl(int a)
    {
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                mass[i][j]=a;
    }
    void print()
    {
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
                cout <<mass[i][j]<<' ';
            cout <<endl;
        }
    }
 
    int& operator[](int i)
    {
        if(kkk==-1)
        {
            kkk=i;
        }
        else if(kkk!=-1)
        {
            return mass[kkk][i];
        }
    }
};
 
int main()
{
    cl k(3);
    k.print();
 
    k[0][0]
 
    return 0;
}
Добавлено через 1 минуту
Что то мне кажется но нужно использовать оператор приведения типа чтоли????
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2013, 15:32     Перегрузка operator[][][]
Посмотрите здесь:

Перегрузка operator+ - C++
при сложени myVector2 = myVector0 + myVector1; выодит сообщения &quot;конструктоор 0&quot; ...1,...2,....2(копирования) а потом деструктор 2,2,1,2...

Перегрузка operator<() - C++
#include &lt;QCoreApplication&gt; #include &lt;QDebug&gt; #include &lt;QVector&gt; class My { public: int a; void operator=(const...

Перегрузка operator= - C++
const Point&amp; operator= (const Point &amp;p) { if (this ==&amp;p) return *this; x = p.x; y = p.y; color = p.color; ...

Перегрузка operator new - C++
Столькнулся с такой проблемой: Есть класс Array, в его конструкторе создается массив int Array::Array(const size_t...

Перегрузка operator[]= - C++
Привет народ, вопрос такой - что и как нужно перегрузить в классе, чтобы работал синтаксис вида class ADE {..}; ADE a; ... a |=...

Перегрузка operator= - C++
Возможно ли перегрузить оператор= так, что бы можно было написать? val = {10, 20, 15};

перегрузка operator<< - C++
помогите отгадать в чет ошибка class MCL{ private: int x,y; public: friend ostream&amp; operator&lt;&lt;(ostream &amp;s, MCL &amp;c); }; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
01.09.2013, 12:31     Перегрузка operator[][][] #16
ninja2, вот так должно скомпилироваться:

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
#include <iostream>
#include <vector>
#include <cstdlib>
 
template <class T>
class Vector
{
    std::vector<T> _data;
public:
    Vector() {}
    Vector(size_t cnt, const T& value)
        : _data(cnt, value)
    {
    }
 
    Vector(const Vector<T>& rhs)
        : _data(rhs._data)
    {
    }
 
    Vector(const std::vector<T>& rhs)
        : _data(rhs)
    {
    }
 
    T& operator[](size_t i)
    {
        return _data[i];
    }
};
 
int main()
{
    Vector<Vector<Vector<int> > > vec(1, Vector<Vector<int> >(1, Vector<int>(1, 42)));
 
    std::cout << vec[0][0][0] << std::endl;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 12:39     Перегрузка operator[][][] #17
Цитата Сообщение от ForEveR Посмотреть сообщение
ninja2, В идеале в данном случае оператор [] должен возвращать объект/массив к которому можно применить еще раз оператор [].
Я бы отбросил "В идеале в данном случае", т.к. нельзя перегрузить множественный оператор subscript, только применяя его неоднократно к типу, с этим же перегруженным оператором.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
01.09.2013, 13:02  [ТС]     Перегрузка operator[][][] #18
Nameless One, От мой вариант, то же самое
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
#include <iostream>
using std::cout;
using std::endl;
 
class cl
{
    int*** p;
    int a;
    int b;
    int c;
public:
    cl(int aa,int bb, int cc, int val=0)
        :a(aa),
        b(bb),
        c(cc)
    {
        p=new int** [a];
        for(int i=0;i<a;i++) 
        {
            p[i]=new int* [b];
            for(int j=0;j<b;j++)
                p[i][j]=new int[c];
        }
        //инициализация
        for(int i=0;i<a;i++)
            for(int j=0;j<b;j++)
                for(int k=0;k<c;k++)
                    p[i][j][k]=val;
    }
    void print()
    {
        cout <<"mu tyt"<<endl;
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                for(int k=0;k<c;k++) cout <<p[i][j][k]<<' ';
                cout <<endl;
            }
            cout <<"-----------------------------"<<endl;
        }
    }
 
    int** operator[](int i){return p[i];}
};
 
int main()
{
    cl c(3,3,3);
 
    c.print();
 
    c[2][2][1]=8;
 
    c.print();
 
    return 0;
}

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

Добавлено через 5 минут
Цитата Сообщение от castaway Посмотреть сообщение
Я бы отбросил "В идеале в данном случае", т.к. нельзя перегрузить множественный оператор subscript, только применяя его неоднократно к типу, с этим же перегруженным оператором.
Ну ладно должна цепочка быть, из subscript::operator[] возвращаем допустим int *p, а потом уже вызывается его собственный [].
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 13:17     Перегрузка operator[][][] #19
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну ладно должна цепочка быть, из subscript::operator[] возвращаем допустим int *p, а потом уже вызывается его собственный [].
Не понял смысл. Поясни.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
01.09.2013, 13:24  [ТС]     Перегрузка operator[][][] #20
Цитата Сообщение от castaway Посмотреть сообщение
Не понял смысл. Поясни.
Ну если у нас внутри subscribe есть допустим указатель на int* p, subscribe имитирует массив.
Я ошибся короче имеется в subscribe int**p имитирует двумерный массив, то мы просто из int* operator[](int i)
возвращаем {return p[i];} и при множественном вызове subscribe s; s[0][0] у нас будет возвращет указатель int* к которому применится вторая операция [], то что форевер имел введу. По другому тут нельзя сделать.


Тут еще непонятка возникла как от освобождать память для моего примера кода выше? От допустим я выделил память под указатель int*** p; и я забыл там за деструктот, но если я его определю отак ~cl(){delete[] p;};, то память вся освободится или мне нужно в цикле обход сделать и удалить каждую ячейку отдельно?????
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
01.09.2013, 13:26     Перегрузка operator[][][] #21
Цитата Сообщение от ninja2 Посмотреть сообщение
Тут еще непонятка возникла как от освобождать память для моего примера кода выше?
Точно так же, как выделял память, только в обратном порядке.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
01.09.2013, 14:04  [ТС]     Перегрузка operator[][][] #22
Цитата Сообщение от Nameless One Посмотреть сообщение
Точно так же, как выделял память, только в обратном порядке.
Ну смотри отак я 100% уверен что память освободится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
~cl()
    {
    for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                delete[] p[i][j];
            }
            delete[] p[i];
        }
        delete[] p;
    };
А если я утак:
C++
1
2
3
4
~cl()
    {
        delete[] p;
    };
Мб все таки она так же автоматом удалится?????

Добавлено через 32 минуты
Ну так что господа вы наверно вопрос не поняли?

Щас я повторю!!!
От имеется у нас класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class cl
{
    int*** p;
    int a;
    int b;
    int c;
public:
    cl(int aa,int bb, int cc)
        :a(aa),
        b(bb),
        c(cc)
    {
        p=new int** [a];
        for(int i=0;i<a;i++) 
        {
            p[i]=new int* [b];
            for(int j=0;j<b;j++)
                p[i][j]=new int[c];
        }
    }
};
В конструкторе выделяется память под трехмерный массив, как мне правильно определить деструктор???

От если я так определю то 100% освобождается память!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
    ~cl()
    {
    for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                delete[] p[i][j];
            }
            delete[] p[i];
        }
        delete[] p;
    };
Ну зачем заморачиваться мб можно попроще отак сделать????
C++
1
2
3
4
    ~cl()
    {
        delete[] p;
    };
Да и все дела????
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 14:06     Перегрузка operator[][][] #23
Цитата Сообщение от ninja2 Посмотреть сообщение
Да и все дела????
Так ты удалишь лишь часть выделенной памяти. Не всю.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.09.2013, 14:12     Перегрузка operator[][][] #24
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну зачем заморачиваться
Этот вопрос стоило себе задать, до начала изучения С++.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 14:32     Перегрузка operator[][][]
Еще ссылки по теме:

Перегрузка operator+ - C++
Как сложить суму годовы продаж всех компаний? Можно использовать перегрузку оператора +? #include &lt;iostream.h&gt; #include &lt;math.h&gt; ...

Перегрузка operator[] - C++
Забыл как перегружать оператор для присваивания значений, а найти не могу ._. Чтобы было вот так: Class A { private: char...

Перегрузка operator->() - C++
Всем привет! Прохожу тему дескрипторов и меня удивляет как работает перегруженный operator-&gt;(). //какой то интерфейс struct...

Перегрузка operator+ - C++
Нужно сложить число с каждым елементом вектора, вот мой код: MyVectorClass.h namespace program { class MyVectorClass { ...

Перегрузка operator-> () - C++
здравствуйте, объясните пож. как работает operator-&gt; (). Что происходит при этом мне понятно, но непонятно как. template &lt;typename T&gt; ...


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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
01.09.2013, 14:32     Перегрузка operator[][][] #25
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну смотри отак я 100% уверен что память освободится:
Да.

Цитата Сообщение от ninja2 Посмотреть сообщение
Мб все таки она так же автоматом удалится?????
Нет.
Yandex
Объявления
01.09.2013, 14:32     Перегрузка operator[][][]
Ответ Создать тему
Опции темы

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