Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

operator[]

354
04 апреля 2007 года
ШпиЁн
468 / / 19.02.2006
Здравствуйте, интересует вот такой вопрос... Как известно, оператор [] используется и для чтения элемента из массива, и для установки значения элемента в массиве(по ссылке). НО различить эти два действия внутри функции реализации невозможно...

Ситуация такая, имеется матрица, количество столбцов известно. Количество элементов в каждом столбце - изменяется произвольно(количество символов в строке, указатель)

Интересует реализация такой операции:

объект[индекс] = "некий_текст"; При этом ПАМЯТЬ под текст выделялась на этапе выполнения этой операции :о) Что нужно перегрузить? Использовать прокси-объекты? В общем, буду рад любой помощи :о) Заранее благодарен... :о)
355
04 апреля 2007 года
<SCORP>
786 / / 21.10.2006
помоему, здесь необходимо перегружать присвоение для элемента матрицы. аналогично можно выделять память под сам элемент при обращении к нему, если его на этот момент ещё не существует. но вот различить чтение и запись, я так понимаю, не получиться
309
04 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Здравствуйте, интересует вот такой вопрос... Как известно, оператор [] используется и для чтения элемента из массива, и для установки значения элемента в массиве(по ссылке). НО различить эти два действия внутри функции реализации невозможно...


В чём проблема? Различаются эти реализации очень просто. Объявляется и реализуется два оператора [] - обычный и константный:

 
Код:
class TArray
{
private:
/// Потроха класса, напишете сами
public:
   TItem& __fastcall operator [] (int Index); // чтение изменяемого значения
   const TItem& __fastcall operator [] (int Index) const; // чтение неизменного значения
};

Кроме того, для неизменного значения вместо константной ссылки можно возвращять значение
354
04 апреля 2007 года
ШпиЁн
468 / / 19.02.2006
Цитата: el scorpio
 
Код:
class TArray
{
private:
/// Потроха класса, напишете сами
public:
   TItem& __fastcall operator [] (int Index); // чтение изменяемого значения
   const TItem& __fastcall operator [] (int Index) const; // чтение неизменного значения
};

Кроме того, для неизменного значения вместо константной ссылки можно возвращять значение


Проверил прямо сейчас. НЕ РАБОТАЕТ. вызывается все время (при чтении и записи)
TItem& __fastcall operator [] (int Index);
Мне ведь нужно не только считывать, но и изменять значения ;o)
Вот код:

Код:
template <class T> class Array
{
private:
   
    int size; // длина массива по x
    T ** data;
   
public:

    Array(void)
    {
    }

    Array(int i)
    {
        size = i == 0 ? 1 : i;
        data = new T*[size];
        for(int j = 0; j < size; j++)
        {
            data[j] = new T;
            *data[j] = NULL;
        }
    }

    ~Array(void)
    {
        delete [] data;
    }

    int length()
    {
        return size;
    }


    const T * & operator[](int elem) const
    {
        assert(elem >= 0 && elem < size);
        cout << "read" << endl;
        return data[elem];
    }

    T * & operator[](int elem)
    {
        assert(elem >= 0 && elem < size);
        cout << "change" << endl;
        return data[elem];
    }
   
};

вот обращение
 
Код:
Array <char> bt(7);
char s[10] = "hello!";
bt[6] = s;
cout << bt[6] << endl;

Что делать? :о)
309
04 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Проверил прямо сейчас. НЕ РАБОТАЕТ. вызывается все время (при чтении и записи)
TItem& __fastcall operator [] (int Index);


Правильно :) , константный оператор будет вызываться только при использовании константного объекта или константной ссылки на объект

 
Код:
void Func (const TArray &Array)
{
   x = Array [0]; // вызвается константный оператор
}


А матрицу лучше реализовывать путём вложения одного массива внутрь другого. Вот так:
TArray <TArray <int>> matrix; // Массив массивов целочисленных значений
Тогда проверка корректности будет выполняться для операций всех уровней индексации.
354
04 апреля 2007 года
ШпиЁн
468 / / 19.02.2006
Хех... У меня же шаблонный класс, вот здесь
 
Код:
void Func (const TArray<char> &Array)
{
   const char * x = Array [0]; // вызвается константный оператор
}

ведь после TArray еще и <char> и т.д. указывать надо, так не подходит - шаблонов много... Хотя работает, спасибо :о)

Все ж таки хотелось бы не уходить далеко от темы и реализовать:

объект[индекс] = "некий_текст"; При этом ПАМЯТЬ под текст выделялась на этапе выполнения этой операции :о)

Можно как-нибудь перегрузить оператор= ?
309
04 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
ведь после TArray еще и <char> и т.д. указывать надо, так не подходит - шаблонов много... Хотя работает, спасибо :о)


А объявить реализацию класса?
typedef TArray<char> TArray_Char;
Далее везде используется тип TArray_Char...

Цитата:
Можно как-нибудь перегрузить оператор=


Конечно можно

 
Код:
class TItem
{
public:
   TItem& __fastcall operator = (const TItem &Other);
   TItem& __fastcall operator = (const char *pStr);
}

Если есть оператор присваивания для объекта другого типа (const char*), то обязательно нужно явно указать оператор присваивания этого типа (const TItem&)
354
04 апреля 2007 года
ШпиЁн
468 / / 19.02.2006
Совсем не ясно...
Вот:
 
Код:
Array <char> bt(7);
char s[10] = "hello!";
bt[6] = s;  // ЧТО нужно перегрузить здесь? чтобы было не просто приравнивание указателей, а копирование памяти? В каком операторе это прописать?
354
05 апреля 2007 года
ШпиЁн
468 / / 19.02.2006
Вопрос исчерпан. Все сделал через спец-класс заглушку :о)
3
05 апреля 2007 года
Green
4.8K / / 20.01.2000
Хм... а зачем всё так сложно?
Для той постановки задачи, которую ты приводишь в топике, достаточно одного стандартного контейнера с индексной адресацией и одного строкового класса.
 
Код:
std::vector<std::string> object;
object[index] = "некий текст";
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог