class TArray
{
private:
/// Потроха класса, напишете сами
public:
TItem& __fastcall operator [] (int Index); // чтение изменяемого значения
const TItem& __fastcall operator [] (int Index) const; // чтение неизменного значения
};
operator[]
Ситуация такая, имеется матрица, количество столбцов известно. Количество элементов в каждом столбце - изменяется произвольно(количество символов в строке, указатель)
Интересует реализация такой операции:
объект[индекс] = "некий_текст"; При этом ПАМЯТЬ под текст выделялась на этапе выполнения этой операции :о) Что нужно перегрузить? Использовать прокси-объекты? В общем, буду рад любой помощи :о) Заранее благодарен... :о)
помоему, здесь необходимо перегружать присвоение для элемента матрицы. аналогично можно выделять память под сам элемент при обращении к нему, если его на этот момент ещё не существует. но вот различить чтение и запись, я так понимаю, не получиться
Цитата:
Здравствуйте, интересует вот такой вопрос... Как известно, оператор [] используется и для чтения элемента из массива, и для установки значения элемента в массиве(по ссылке). НО различить эти два действия внутри функции реализации невозможно...
В чём проблема? Различаются эти реализации очень просто. Объявляется и реализуется два оператора [] - обычный и константный:
Код:
Кроме того, для неизменного значения вместо константной ссылки можно возвращять значение
Цитата: el scorpio
Код:
class TArray
{
private:
/// Потроха класса, напишете сами
public:
TItem& __fastcall operator [] (int Index); // чтение изменяемого значения
const TItem& __fastcall operator [] (int Index) const; // чтение неизменного значения
};
{
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];
}
};
{
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;
char s[10] = "hello!";
bt[6] = s;
cout << bt[6] << endl;
Что делать? :о)
Цитата:
Проверил прямо сейчас. НЕ РАБОТАЕТ. вызывается все время (при чтении и записи)
TItem& __fastcall operator [] (int Index);
TItem& __fastcall operator [] (int Index);
Правильно :) , константный оператор будет вызываться только при использовании константного объекта или константной ссылки на объект
Код:
void Func (const TArray &Array)
{
x = Array [0]; // вызвается константный оператор
}
{
x = Array [0]; // вызвается константный оператор
}
А матрицу лучше реализовывать путём вложения одного массива внутрь другого. Вот так:
TArray <TArray <int>> matrix; // Массив массивов целочисленных значений
Тогда проверка корректности будет выполняться для операций всех уровней индексации.
Код:
void Func (const TArray<char> &Array)
{
const char * x = Array [0]; // вызвается константный оператор
}
{
const char * x = Array [0]; // вызвается константный оператор
}
ведь после TArray еще и <char> и т.д. указывать надо, так не подходит - шаблонов много... Хотя работает, спасибо :о)
Все ж таки хотелось бы не уходить далеко от темы и реализовать:
объект[индекс] = "некий_текст"; При этом ПАМЯТЬ под текст выделялась на этапе выполнения этой операции :о)
Можно как-нибудь перегрузить оператор= ?
Цитата:
ведь после TArray еще и <char> и т.д. указывать надо, так не подходит - шаблонов много... Хотя работает, спасибо :о)
А объявить реализацию класса?
typedef TArray<char> TArray_Char;
Далее везде используется тип TArray_Char...
Цитата:
Можно как-нибудь перегрузить оператор=
Конечно можно
Код:
class TItem
{
public:
TItem& __fastcall operator = (const TItem &Other);
TItem& __fastcall operator = (const char *pStr);
}
{
public:
TItem& __fastcall operator = (const TItem &Other);
TItem& __fastcall operator = (const char *pStr);
}
Если есть оператор присваивания для объекта другого типа (const char*), то обязательно нужно явно указать оператор присваивания этого типа (const TItem&)
Вот:
Код:
Array <char> bt(7);
char s[10] = "hello!";
bt[6] = s; // ЧТО нужно перегрузить здесь? чтобы было не просто приравнивание указателей, а копирование памяти? В каком операторе это прописать?
char s[10] = "hello!";
bt[6] = s; // ЧТО нужно перегрузить здесь? чтобы было не просто приравнивание указателей, а копирование памяти? В каком операторе это прописать?
Вопрос исчерпан. Все сделал через спец-класс заглушку :о)
Для той постановки задачи, которую ты приводишь в топике, достаточно одного стандартного контейнера с индексной адресацией и одного строкового класса.
Код:
std::vector<std::string> object;
object[index] = "некий текст";
object[index] = "некий текст";