Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Перегрузка оператора [], [...,...,..] 
:(
    Опции темы
Vo1Ce
Дата 22.4.2010, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Надеюсь не повторяюсь. С++
 Нужно ?перегрузить опертор? [], в классе с, к примеру, двумерным массивом. Таким оброзом, чтобы обращаться к элементам массива можно было MyClass[line,column], а не как обычно MyClass[line][column] ... Интерисуют конткретно методы перегрузки оператора [] методы реализации такой записи.

Это сообщение отредактировал(а) Vo1Ce - 23.4.2010, 10:17
PM MAIL   Вверх
ToTToRo
Дата 23.4.2010, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.4.2010

Репутация: нет
Всего: нет



А разве так можно?
PM MAIL   Вверх
t_gran
Дата 23.4.2010, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Vo1Ce, вы сами понимаете что написали? Покажите компилятор который это проглотит:
Код

int main ()
{
   int abc[1][1];
   abc[0,0]= 1;
   return 0;
}




--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
GoldFinch
Дата 23.4.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



Vo1Ce, operator[] - бинарный, он поддерживает только один операнд внутри []
вы можете перегрузить operator, (запятую) для своего типа индекса, но тогда придется писать

foo[idx_t(1), 1]
PM MAIL ICQ   Вверх
Vo1Ce
Дата 23.4.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Цитата(GoldFinch @ 23.4.2010,  08:42)
Vo1Ce, operator[] - бинарный, он поддерживает только один операнд внутри []
вы можете перегрузить operator, (запятую) для своего типа индекса, но тогда придется писать

foo[idx_t(1), 1]

это уже интересней, спасибо. Можно пример какой-нибудь? Я не подумал о возможности перегрузки оператора запятая...  Или вообще, есть какие-нибудь ещё методы, чтобы использовать запись [...,...]. (в голову только пирходило то, что бы в [] вводить строку, ну тогда, я не уверен с тем, как избавиться от ввода ковычек.

 з.ы. каким задание я понял, таким и написал... Может перегрузка [] и не возможна по нескольким операндам, но я думаю теперь суть того, что мне надо ясна...

add: что-то я самостоятельно не могу разобраться с перегрузкой запятой. Я как понял, он является и бинарным и унарным в различных случаях? Ну конкретно ничего из него я получить так и не смог...

Это сообщение отредактировал(а) Vo1Ce - 23.4.2010, 11:13
PM MAIL   Вверх
GoldFinch
Дата 23.4.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



Код

struct index_t
{
   index_t(int i) : value(i) {}
   int value;
};

struct index2_t
{
   index2_t(int i_, int j_) : i(i_), j(j_) {}
   int i, j;
};

template<typename T, int N, int M>
struct matrix_t
{
   T data[N*M];
   T& operator[](index2_t index)
   {
       return data[index.i + index.j * N];
   }
};

// index2_t operator,(int i, int j)  - не заработает
// т.к. нельзя перегрузить для аргументов встроенных типов

index2_t operator,(index_t i, index_t j)
{
   return index2_t(i.value, j.value);
}
index2_t operator,(int i, index_t j)
{
   return index2_t(i, j.value);
}
index2_t operator,(index_t i, int j)
{
   return index2_t(i.value, j);
}

int main()
{
   matrix_t<int, 10, 5> m;
   for(int i = 0; i != 10*5; ++i)
       m.data[i] = i;

   cout << m[index_t(1), 2] << '\n';
   cout << m[3, index_t(4)] << '\n'; 
}


PM MAIL ICQ   Вверх
Sartorius
Дата 23.4.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Vo1Ce, не заморачивайтесь. Перегружайте operator(). Какая вам разница круглые скобки или квадратные?

PM MAIL ICQ   Вверх
Vo1Ce
Дата 23.4.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



GoldFinch, спасибо, буду разбираться. Идей нет, как можно сделать, чтобы запись всё же не обращалась так явно к классу?

Sartorius, к сожалению задание именно такое =), ничего поделать не могу, не для себя делаю...

Это сообщение отредактировал(а) Vo1Ce - 23.4.2010, 20:39
PM MAIL   Вверх
GoldFinch
Дата 23.4.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



Vo1Ce, явное обращение к классу можно заменить явным обращением к переменной этого класса %)

т.е. вместо [T(1), 2]
например [t+1, 2]  (вместо "+" - любой бинарный оператор, тип t - T)

вобщем надо чтобы один из операндов бинарного оператора имел пользовательский тип
PM MAIL ICQ   Вверх
Vo1Ce
Дата 23.4.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



это конечно да, и для меня труда не составит всё оформить =) но интересно узнать, каким образом осуществить именно такую запись [line,column]. Вобщем спасибо GoldFinch, вы мне многим помогли. Но вопрос остаётся не закрытым, если кто знает или узнает методы, сообщите, сдача задачи на след неделе...
PM MAIL   Вверх
GoldFinch
Дата 23.4.2010, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



есть еще один весьма сомнительный способ - объявить глобальные переменные типа index_t
_0, _1, _2, _3, ... (много)
т.е.

index_t _0(0);
index_t _1(1);
index_t _2(2);
...

в принципе пару сотен таких переменных можно сгенерить скриптом.

тогда код будет такой a[_1, 2]

причем эти переменные можно объявить не в глобальной области видимости, а в области видимости operator,(index_t, int)

PM MAIL ICQ   Вверх
Vo1Ce
Дата 24.4.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



ух отлично, так у меня получилось, только при обьявлении их в видимости оператора не компилируется... Пишет что не заданы. 
  А может быть возможным, каким либо образом, обьединие "[" как часть оператора и как идентификатор... т.е.  в данном случае запись [[1,2] заменить на [1,2] неким заклинанием? 
 Если всё же кто-то знает или разгадает секрет какого-то метода для записи [...,...] жду с нетерпением, заранее всем спасибо и спасибо всем, кто уже откликнулся.
PM MAIL   Вверх
GoldFinch
Дата 24.4.2010, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



Цитата(Vo1Ce @  24.4.2010,  18:26 Найти цитируемый пост)
А может быть возможным, каким либо образом, обьединие "[" как часть оператора и как идентификатор... т.е.  в данном случае запись [[1,2] заменить на [1,2] неким заклинанием? 


только своим препроцессором. язык такого не позволяет
PM MAIL ICQ   Вверх
Vo1Ce
Дата 24.4.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



 Извините, а зашаблонить нельзя как-нибудь опертор запятую. Чтобы например если вводишь один операнд инт и другой инт, то он первый его операнд переделывет в какой-нить класс\структуры с эелментом, равным этому инт и дальше работал так? 
  И ещё мне предложили использовать макрос, и просто заменить () на []. Но от этого появляются кое-какие неудобства  и у меня такой вопрос, вообще обе эти идеи будут работать? и если сделать #define на участок программы где класс , и соответсвенно #undef в конце класса, то при вызове MyClass[1,2] , где в классе [] заменены на (), то компилятор будет жаловаться? кто-нибудь проверить может?
 Спрашиваю вас, т.к. уехал от рабочего места до понедельника, и сейчас нет возможности проверить это всё. Заранее спасибо.

Это сообщение отредактировал(а) Vo1Ce - 24.4.2010, 21:06
PM MAIL   Вверх
GoldFinch
Дата 25.4.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



шаблоны тут не помогут.

с макросом - вообще не понял как это %)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.