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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка [] 
V
    Опции темы
afanp
Дата 19.4.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



делаю класс для массива безопасного. такой вопрос : как перегрузить [] ? 
Код



int& operator[](int n){
        if( n<0 || n >=size) {
            cout << "mistake\n";
        //    return -1;
        }
        else{
            return mas[n];
        }
    }

если я убираю операцию & то я могу вернуть при неправильном обращении к элементу -1, но при этом не смогу в других функциях задать значение элемента. как же быть ?
PM MAIL   Вверх
Acer
Дата 19.4.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

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



Код

class MyClass {

public:
    MyClass(){};
    ~MyClass(){};

public:
    MyClass operator[]( int _in ){
        return this[_in];
    }

};

PM MAIL   Вверх
mes
Дата 19.4.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(afanp @  19.4.2009,  12:17 Найти цитируемый пост)
как же быть

1. подставлять заглушку, типа
Код

class my_vector
{
   public:
      int & outta_range () { return m_stub; }
      int& operator[](int n){     if( n<0 || n >=size) return outta_range() else ..
   private:
      int m_stub;
} v;

int&  val=v[10];
 if (val!=v.outta_range()) val=15; 

но не советую.
2. вызывать исключение - предпочтительнее. 
3. пользовать итератор  - "обход" небезопасности  []
4.. использовать std::vector, в котором есть все три способа
небезопаное  []
безопасное с исключением at()
и итераторы
5...



Это сообщение отредактировал(а) mes - 19.4.2009, 13:35


--------------------
PM MAIL WWW   Вверх
and277
Дата 19.4.2009, 14:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(afanp @ 19.4.2009,  13:17)
делаю класс для массива безопасного. такой вопрос : как перегрузить [] ? 
Код



int& operator[](int n){
        if( n<0 || n >=size) {
            cout << "mistake\n";
        //    return -1;
        }
        else{
            return mas[n];
        }
    }

если я убираю операцию & то я могу вернуть при неправильном обращении к элементу -1, но при этом не смогу в других функциях задать значение элемента. как же быть ?

Не надо возвращать ретёрном ничего! Используй exit(1);

Код

int& operator[](int n){
        if( n<0 || n >=size) {
            cout << "mistake\n";
            exit(1);
        }
        else  return mas[n];
    }



Это сообщение отредактировал(а) and277 - 19.4.2009, 14:05
PM MAIL   Вверх
mes
Дата 19.4.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(and277 @  19.4.2009,  13:02 Найти цитируемый пост)

Не надо возвращать ретёрном ничего! Используй exit(1);

И можно будет дальше спокойно продолжать заполнять массив ?!  smile 



--------------------
PM MAIL WWW   Вверх
afanp
Дата 19.4.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Acer,  не срабатывает этот метод )
mes спасибо большое, помогли 

Это сообщение отредактировал(а) afanp - 19.4.2009, 15:57
PM MAIL   Вверх
and277
Дата 19.4.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mes @ 19.4.2009,  14:25)
Цитата(and277 @  19.4.2009,  13:02 Найти цитируемый пост)

Не надо возвращать ретёрном ничего! Используй exit(1);

И можно будет дальше спокойно продолжать заполнять массив ?!  smile

Там же границы проверяются на входе... Я не как не смогу записать за границы массива! exit(1) -аварийно завершит программу если условие не выполняется. Поправьте если я не прав.
PM MAIL   Вверх
Rififi
Дата 19.4.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



afanp, 
сделай две версии []. и не надо никакого -1
Код
const int& operator[] (int n) const
{
    if (n <0 || n >= size)
        throw std::out_of_range("");
    return mas[i];
}

int& operator[] (int n)
{
    if (n <0 || n >= size)
        throw std::out_of_range("");
    return mas[i];
}

PM MAIL   Вверх
afanp
Дата 19.4.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Rififi, 
а можете объснить как это работает?
PM MAIL   Вверх
Rififi
Дата 19.4.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



afanp,
точно также, как и у тебя, только бросается исключение при выходе индекса за границы массива.
константная версия  op[] нужна чтобы получать значение у константного объекта.
PM MAIL   Вверх
afanp
Дата 19.4.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Rififi, спасибо
PM MAIL   Вверх
sdukshis
Дата 19.4.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Rififi @ 19.4.2009,  16:32)
afanp, 
сделай две версии []. и не надо никакого -1
Код
const int& operator[] (int n) const
{
    if (n <0 || n >= size)
        throw std::out_of_range("");
    return mas[i];
}

int& operator[] (int n)
{
    if (n <0 || n >= size)
        throw std::out_of_range("");
    return mas[i];
}

Наверное в качестве первой перегрузки Вы имели в виду следующее:
Код

int operator[](int n) const

Для работы с константными объектами.
PM MAIL   Вверх
azesmcar
Дата 19.4.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Acer

Имена начинающиеся с подчеркивания или содержащие двойное подчеркивание зарезервированы для внутреннего использования..их использование нежелательно smile

Цитата

Наверное в качестве первой перегрузки Вы имели в виду следующее:

а так чем плохо?
PM   Вверх
afanp
Дата 19.4.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А Можете объяснить как именно это работает? 
Код

int& operator[](int n){
        if( n<0 || n >=size) {
            cout << "mistake\n";
        //    return -1;
        }
        else{
            return mas[n];
        }
    }

всмысле почему нам нельзя просто вернуть -1 или что то еще?
PM MAIL   Вверх
zim22
Дата 19.4.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(afanp @  19.4.2009,  19:11 Найти цитируемый пост)
всмысле почему нам нельзя просто вернуть -1 или что то еще?

а почему нам нельзя перегрузить например оператор == и с его помощью складывать два операнда. вот смешно то будет. 
а ещё смешней если перегруженный операнд < будет наоборот работать как >.


--------------------
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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