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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 57, средняя оценка - 4.95
lega4
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 19
#1

Перегрузка оператора индексации [] - C++

04.05.2011, 10:23. Просмотров 7434. Ответов 8
Метки нет (Все метки)

Имеется некоторый класс почти массив. "Почти" - потому что элементы лежат в памяти не по байтам, а по битам и, соответственно, для установки значений и получения значений элементов реализованы специальные функции.
Требуется перегрузить [] так, чтобы:
1. Можно было просто написать unsigned j=myclassvar["abc"], где myclassvar - переменная моего класса, "abc" - название "поля". С этой задачей я справился без проблем, т.к. есть функция возврата значения нужного поля.
2. И чтобы работал такой код myclassvar["abc"]=4;
Собственно, со вторым пунктом проблемы. Когда в классе используются встроенные типы данных, то достаточно возвращать ссылку на требуемый элемент класса и все прокатит. А тут непонятно как... Подскажите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2011, 10:23     Перегрузка оператора индексации []
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
04.05.2011, 10:55     Перегрузка оператора индексации [] #2
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
#include<iostream>
 
class ExlandClass
{
/*
Этот великолепный класс имеет в себе указатель на масив и размер масива.
Так же реализоват доступ к элементу масива по индексу, причём проверка
на выход за границы масива не осуществляется потому что это не круто.
    */
    double* m;
    unsigned size;
public:
    ExlandClass(int Size) : size(Size){m = new double [size];}
    ~ExlandClass(){delete[] m;}
 
    /*чтобы к полученному элементу обеспечить доступ на запись
    + не гонять лишние fizeof(double) - sizeof(double&) байта мы высылаем ссылочку*/
    double& operator [] (unsigned i) { return m[i]; }
 
};
 
int main()
{
    ExlandClass m(5);
    m[3] = 5;
    std::cout << m[3] << '\n';
 
    return !true && !false;
}
во
lega4
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 19
04.05.2011, 11:01  [ТС]     Перегрузка оператора индексации [] #3
CEBEP, вы не поняли вопроса. У меня массив хоть и стандартного типа, но элементы в нем располагаются побитово.
Т.е. возможна такая ситуация:
Байт:

|_|_|_|_|_|_|_|_|
|1 эл.|2 эл.|3 э|
В одном байте лежит 3 поля.

Поэтому возвращать ссылку на весь байт мне не надо. Мне нужно только нужное поле (Как написано выше, функции уже реализованы. Вопрос в том, в какое место оператора[] их воткнуть, чтобы работал вышеприведенный код)
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
04.05.2011, 11:07     Перегрузка оператора индексации [] #4
C битовыми полями пробовали работать?
lega4
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 19
04.05.2011, 11:08  [ТС]     Перегрузка оператора индексации [] #5
mimicria, динамически? Это возможно?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
04.05.2011, 11:09     Перегрузка оператора индексации [] #6
Цитата Сообщение от lega4 Посмотреть сообщение
Вопрос в том, в какое место оператора[] их воткнуть, чтобы работал вышеприведенный код
lega4, покажи свои наработки по первому пункту, а то я что-то не вижу "вышеприведенный код"
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
04.05.2011, 11:11     Перегрузка оператора индексации [] #7
Цитата Сообщение от lega4 Посмотреть сообщение
mimicria, динамически? Это возможно?
Если структура меняется динамически, то наврядли.
lega4
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 19
04.05.2011, 11:11  [ТС]     Перегрузка оператора индексации [] #8
Nameless One,
C++
1
2
3
4
unsigned TBitFields::operator [](Cmystring ind)
{
    return this->GetField(ind);
}
GetField возвращает значение нужного поля.
"Вышеприведенный код" - это myclassvar["abc"]=4;

mimicria, вот и я так думаю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2011, 12:31     Перегрузка оператора индексации []
Еще ссылки по теме:

Перегрузка оператора индексации в одном классе и использование в другом - C++
Вообщем проблема состоит в том, что не понимаю как это сделать. Есть класс Document в нем есть вектор vec состоящий из Item'ов. В классе...

Перегрузка оператора индексации для класса плохо себя ведёт - C++
Собственно, есть такое дело. #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; ...

Перегрузка индексации - C++
Здраствуйте. Подскажите пожалуйста, как перегрузить операцию двойной индексации. Это нужно чтобы получить доступ к элементу двумерного...

оператора индексации+класс+структура - C++
Задача такая нужна создать словарь терминов. 1.Создаю свой тип данных помощью struct term (слово термин) definition (определение к...

Реализовать перегрузку оператора индексации - C++
Здравствуйте! Очень нужна помощь, помогите сделать перегрузку оператора индексации. #include &lt;iostream&gt; #include &lt;string&gt; ...


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

Или воспользуйтесь поиском по форуму:
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
04.05.2011, 12:31     Перегрузка оператора индексации [] #9
ща будет. . .

Добавлено через 1 час 16 минут
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
#include <iostream>
 
class StrangeClass
{
 
    /*задача оказалась для меня сложна но, тем не менее, я её решил. В прочем, решение малопроизводительное.
    Суть в следующем: в с++ мнимальный передаваемый объём - байт. следовательно, мы никак не уйдём от
    передачи целого байта при взаимодействии со встроенными типами. т.е. мы получаем байт и куда-то его пишем.
    Чтобы корректно обработать получаемую информацию как нужно мы вынуждены высылать не просто ссылку на какую-то
    память понимаемую как встроенный тип а сущность работающую в соответствии с нашей формой хранения данных.
    роль такой сущности играет bufer. для обработки информации ему нужна ссылка на байт памети с которым ведётся работа
    и номер сигмента с которым ведётся работа. Уверен, вам не трудно будет приспособить систему для контекста вашей задачи.
    Греет душу то что задача, явно, учебная. если же такое нужно на практике то верный выбор - отказатся от таких 
    красивых оформлений*/
    char fuckedByte;
public:
    struct Bufer
    {
        unsigned i;
        char* byte;
        Bufer(char* Byte): byte(Byte), i (0) {   }
 
        void operator = (char e)
        {
            switch(i)
            {
            case 0:
                *byte -= *byte / ( 2 * 2 * 2 * 2 * 2 ) * 2 * 2 * 2 * 2 * 2;//очистили байты)))
                *byte += e % ( 2 * 2 * 2 ) * 2 * 2 * 2 * 2 * 2;
                break;
            case 1:
                *byte -= *byte / ( 2 * 2 ) % ( 2 * 2 * 2 ) * 2 * 2;
                *byte += e % ( 2 * 2 * 2 ) * 2 * 2;
                break;
            case 2:
                *byte -= *byte % ( 2 * 2 );
                *byte += e % ( 2 * 2 );
            }
        }
        operator char()
        {
            switch(i)
            {
            case 0:
                return *byte / 2 / 2 / 2 / 2 / 2;
            case 1:
                return *byte / 2 / 2 % ( 2 * 2 * 2);
            case 2:
                return *byte % ( 2 * 2);
            }
            return !true && !false;
        }
 
    };
    Bufer bufer;
 
    StrangeClass(char init1, char init2, char init3):
        bufer(&fuckedByte)
    {
        /*скажем, из инициализирующих трёх майтов нас интирересуют последние
        три байта первых двух и два третьего, как в вашем примере.
        И да помилует меня асемпблер за медленность и тупорылось алгоритмов, уверен, у вас там что-то по разумнее.*/
        fuckedByte = init1 % ( 2 * 2 * 2 ) * 2 * 2 * 2 * 2 * 2;//вроде бы так я возьму три последних бита и запишу в три первых.
        fuckedByte += init2 % ( 2 * 2 * 2 ) * 2 * 2;
        fuckedByte += init3 % ( 2 * 2 );//я не перемножаю двойки не для того чтобы это делал кто-то другой а чтобы явно видеть - сколько двоек - столько байтов.
    }
 
    Bufer& operator [] (unsigned i)
    {
        bufer.i = i;
        return bufer;
    }
};
 
int main (void)
{
    StrangeClass a(3, 9, 2);
 
    std::cout << static_cast<int>(a[0]) << ' ' << static_cast<int>(a[1]) << ' ' << static_cast<int>(a[2]) << std::endl; 
 
    a[0] = 10;
 
    std::cout << static_cast<int>(a[0]) << ' ' << static_cast<int>(a[1]) << ' ' << static_cast<int>(a[2]) << std::endl;
 
    return !true && !false;
}
Не получилось элегантного решения. короче,, всё подробно в коментах.
Yandex
Объявления
04.05.2011, 12:31     Перегрузка оператора индексации []
Ответ Создать тему
Опции темы

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