Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
1

Переопределить оператор присваивания

31.01.2010, 17:07. Просмотров 1974. Ответов 14
Метки нет (Все метки)


Немогу переопределить оператор присваивания для своего типа - линейного списка. Проблема в том, что я хочу переопределить не что-то типа
C++
1
2
3
TMySpisok a;
TMySpisok b;
a = b;
а такую конструкцию:
C++
1
2
3
TMySpisok a;
int x;
a[5] = x;
Как это сделать? У меня есть метод
C++
1
2
3
4
5
void putItem(int position, int variable)
{
...
    return;
}
Думаю, что он делает ясно из описания. Как мне его представить как оператор?

Добавлено через 19 минут
Если нужно могу выложить подробный код. Сколько читаю литературу по перегрузке операторов, нигде не нашел, чтобы именно так перегружать. Есть некоторые варианты для структур с 2 полями, но мне нужно именно для класса.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2010, 17:07
Ответы с готовыми решениями:

Как создать виртуальный поток и переопределить оператор <<?
Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный. Впрочем, создание...

Оператор присваивания в условии
Есть конструкция вида: class AC_Node; class Vector; Vector *pQueue = someValue; AC_Node* r...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор...

Переопределить оператор << в классе
Добрый день. Не пойму как переопределить оператор &lt;&lt; для моего класса Пробую так #include...

14
Эксперт С++
1663 / 1035 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.01.2010, 17:17 2
Переопредели оператор индексации:
C++
1
int& TMySpisok::operator [] (int position);
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
31.01.2010, 17:32  [ТС] 3
Я его уже переопределил. Мне же нужно теперь не только получить значение по индексу, а и присвоить значение по индексу. Ну если кто работал с линейными списками (vector, List) тот меня поймет, все эти типы предоставляют возможность присвоить значение так
C++
1
spisok[5] = 7;
хотя на самом деле это не массив, а отдельный класс - линейный список.

Добавлено через 3 минуты
Цитата Сообщение от Nick Alte Посмотреть сообщение
Переопредели оператор индексации:
Код C++1 int& TMySpisok::operator [] (int position);
Я переопределил так
C++
1
2
3
4
int &operator [](int Index)
{
  return GetItem(Index);
}
Что делает GetItem думаю понятно. Но это немного другое.
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
31.01.2010, 19:14 4
На самом деле, в таких случаях переопределяются два оператора:
C++
1
2
3
4
5
6
7
8
9
int& operator[] (int position)
{
    // тут реализация записи в позицию - put_Item
}
 
int operator[] (int position) const
{
    // тут реализация чтения из позиции - get_Item
}
А компилятор сам разберется, в каком случае использовать константную версию (для чтения) или неконстантную - для записи......
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
01.02.2010, 02:17  [ТС] 5
Цитата Сообщение от CheshireCat Посмотреть сообщение
int& operator[] (int position)
{
// тут реализация записи в позицию - put_Item
}
Не совсем ясно где мне брать тут саму переменную, значение которой нужно записывать.

C++
1
2
3
4
5
6
7
8
9
10
int& operator[](int position)
{
    PutItem(position, <некая переменная>);
    return 0;
}
 
int operator[] (int position) const
{
    return GetItem(position);
}
0
Эксперт С++
1663 / 1035 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
01.02.2010, 18:47 6
Переменная берётся непосредственно из объекта:
C++
1
2
3
4
int& TMySpisok::operator [] (int position)
{
    return FindByPosition(position)->int_data;
}
В более хитрых случаях, (например, когда значение не записывается непосредственно в переменную), можно возвращать прокси-объекты. Но это вряд ли нужно в данном случае.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
01.02.2010, 22:30  [ТС] 7
Не совсем понятно. У меня 2 ситуации: в первой нужно записать число в определенную позицию, а во второй считать.
Цитата Сообщение от Nick Alte Посмотреть сообщение
Переменная берётся непосредственно из объекта:
Это как я понимаю найти число по позиции и вернуть его. Я это сделал. А вот как записать?
вот код мне посоветовали
C++
1
2
3
4
5
int& operator[](int position)
{
    PutItem(position, <некая переменная>);
    return 0;
}
position у меня известно. Откуда мне взять значение, которое необходимо по этой позиции записать? Из какого объекта? Из моего класса? Так что это будет: взять число из этой позиции и снова в неё записать?
Я сколько Страуструпа читал, все равно не понял. У него там примера такого типа нету. Тоже только чтение по индексу. А запись...
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.02.2010, 23:30 8
Нифига себе - посоветовали......
Если ты сам не знаешь, откуда тебе взять значение, которое надо в эту позицию записать - а откуда мы-то это узнаем? Телепатии, увы, не обучены.....
Попробуй написать:
а. Метод записи значения в позицию,
б. Тестовый код, который запишет в заданную позицию, например, значение 1234.
И покажи код.....
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
02.02.2010, 17:50  [ТС] 9
Хорошо. Выкладываю
MyClass.h
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 "windows.h"
class MyClass
{
private:
    int mass[100];
 
/*конструкторы, деструкторы я пропускаю*/
int GetItem(int Index)
{
    int c = Index % 100 +18; // тут будут значительно более сложные вычисления
    return mass[c % 100];
}
 
public: 
void PutItem(int position, int variable)
{
    int k = position % 100 + 37; // тут будут значительно более сложные вычисления
    mass[k % 100] = variable;
    return;
}
/*int& operator[](int position)
{
 PutItem(position, <некое число, стоящее после знака присваивания. Я не знаю как мне его получить из этого кода((>);
    return <что тут возвращать тоже не знаю. Как бы этот метод должен привоить нечто, и на этом завершиться>;
}*/
int operator[] (int position) /*const - на это компилятор ругается*/
{
    return GetItem(position);
}
};
Использование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include "conio.h"
#include "MyClass.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    MyClass x;
    for(int i=63;i<163;++i)
        x.PutItem(i,7);  /*x[i] = 7; - как такое сделать не знаю*/
    cout<<x[3];
    getch();
    return 0;
}
Цитата Сообщение от CheshireCat Посмотреть сообщение
Если ты сам не знаешь, откуда тебе взять значение, которое надо в эту позицию записать - а откуда мы-то это узнаем? Телепатии, увы, не обучены.....
Я то знаю, что это значение пользователь запишет после знака присваивания, но как мне его именно при определении оператора узнать? Я плохо формулирую вопрос? Просто с таким сталкиваюсь впервые... Нашел литературу про построение компиляторов, но думаю это не поможет. Лучше с операторами разобраться.
Вместо mass может быть какая угодно структура данных. Допустим я вообще буду не массивы использовать а писать напрямую в память и брать оттуда значения. Этой фразой хочу подчеркнуть, что только изменение индексации не поможет. Я сам должен буду написать методы putItem() и GetItem(), засунуть их в
C++
1
private
а потом определить операторы присваивания и взятия по индексу, в которых и будут использованы putItem() и GetItem().
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
02.02.2010, 18:19 10
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
#include <iostream>
using namespace std;
 
class MyClass
{
private:
    int mass[100];
 
    int CalculateHashGet(int index) const
    {
        return index % 100 + 18; // реально тут могут быть какие угодно вычисления....
    }
 
    int CalculateHashPut(int index) const
    {
        return index % 100 + 37; // тут будут значительно более сложные вычисления!
    }
 
public:
    void PutItem(int position, int variable)
    {
        this->operator[] (position) = variable;
    }
 
    int& operator[] (int position)
    {
        int k = CalculateHashPut(position) % 100; // здесь какие угодно вычисления,
                                                  // как обратиться к нужному элементу....
 
        return mass[k]; // а здесь может быть и другой способ записи в память....
    }
 
    int operator[] (int position) const
    {
        int k = CalculateHashGet(position);
        
        return mass[k]; // а здесь может быть и другой способ чтения из памяти....
    }
 
};
 
int main()
{
    MyClass x;
    for(int i = 63; i < 163; ++i)
            x[i] = 7;
    cout << x[3] << endl;
    return 0;
}
 
// 7
// 
// Process returned 0 (0x0)   execution time : 0.031 s
// Press any key to continue.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
02.02.2010, 22:10  [ТС] 11
Упростил уже его по-максимуму, читает оно нормально по индексу, а вот присваивает((( Причем, если я работаю с массивами, переменными или еще какими структурами языка С++, то оно нормально обе операции делает, а вот в таком случае, когда я сам выделяю и заполняю память((( Что делать с этим? Как тут можно выкрутиться?
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
#include "windows.h"
template<class Type>
class MyClass
{
private:
    HANDLE head;
    void* First; //указатель на первый элемент списка
    void* Lastf;  //указатель на последний элемент Last Factum
    void* Lastp;  //указатель на физически последний элемент
    int count;  //число элементов списка
    int hesh; //сколько таблиц используется для хранения этого списка
    void* Table[1024]; //массив указателей на строки ХЕШ - таблицы
    Type test;
public:
void Create()
{
    head = GetProcessHeap();
    void* pointer;
    pointer = HeapAlloc(head,0, 8192);
    Table[0] = pointer;
    First = Table[0];
    Lastf = Table[0];
    Lastp = Table[0];
    count = 0;
    hesh = 1;
    return;
}
Type& operator[] (const int position)
{
    Type x;
    void* pn = Table[position / 1024];
    int pos = position % 1024;
    __asm
    {
        mov eax, pn
        mov ecx, pos
        cmp ecx, 0
        je goend
notend:
        mov eax, [eax+4]
            loop notend
goend:
        mov ebx, [eax]
        mov x, ebx
    }
    test = x;
   return test; 
}
};
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
02.02.2010, 23:06 12
А вот нафига ты там накрутил ассемблер???
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
02.02.2010, 23:53  [ТС] 13
А там без него никак. Я пишу свой класс на асме в С++. Это задание такое. Вообщем я реализовал то, что хотел. Всем спасибо. Но тут так выходит, что если ты в своей программе сам управляеш памятью, то нчего не получится. Нужно если массив - то массив С++. А так как у меня - лучше сразу об стену. Я сделал получение элемента по индексу, а вставка - пусть останется на совести Кернигана и Риччи)
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
03.02.2010, 09:53 14
Керниган и Ричи здесь совершенно ни при чем Ссылка возвращается как адрес нужного элемента в регистре EAX.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
03.02.2010, 17:00  [ТС] 15
Спасибо. Я разобрался. Большое спасибо. Да там просто ссылку нужно передавать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2010, 17:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как переопределить оператор ++ типа char?
Добрий день Хочу спросить возможно ли как-то переопредилить оператор ++ типа char?

Оператор присваивания
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать ...

Оператор присваивания
С помощью оператора присваивания выполнить следующие действия: 1) Переменной Z присвоить значение...

Оператор присваивания.
Всем привет!В универе щас работаем с классами и перегрузками.В частности перегрузкой оператора...


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

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

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