Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/44: Рейтинг темы: голосов - 44, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 19

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

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

Студворк — интернет-сервис помощи студентам
Имеется некоторый класс почти массив. "Почти" - потому что элементы лежат в памяти не по байтам, а по битам и, соответственно, для установки значений и получения значений элементов реализованы специальные функции.
Требуется перегрузить [] так, чтобы:
1. Можно было просто написать unsigned j=myclassvar["abc"], где myclassvar - переменная моего класса, "abc" - название "поля". С этой задачей я справился без проблем, т.к. есть функция возврата значения нужного поля.
2. И чтобы работал такой код myclassvar["abc"]=4;
Собственно, со вторым пунктом проблемы. Когда в классе используются встроенные типы данных, то достаточно возвращать ссылку на требуемый элемент класса и все прокатит. А тут непонятно как... Подскажите, пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2011, 10:23
Ответы с готовыми решениями:

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

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

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

8
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
04.05.2011, 10:55
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;
}
во
1
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 19
04.05.2011, 11:01  [ТС]
CEBEP, вы не поняли вопроса. У меня массив хоть и стандартного типа, но элементы в нем располагаются побитово.
Т.е. возможна такая ситуация:
Байт:

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

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

mimicria, вот и я так думаю
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
04.05.2011, 12:31
ща будет. . .

Добавлено через 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;
}
Не получилось элегантного решения. короче,, всё подробно в коментах.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2011, 12:31
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru