Помню очень очень давно, когда мне нужен был объект двумерный массив с заданными константами размерами (и достаточно маленький чтобы не перегружать стек), а так же мне не нравилось что двумерные массивы требовали дополнительный массив ссылок, который еще нужно было инициализировать, я создавал класс (формально два, так как перегружать оператор [] можно только один раз, для второй перегрузки нужен класс посредник), симулирующий поведение двумерного массива на одномерном, при этом сам массив определялся не как ссылка на него, а как собственно сам объект
нытьесейчас я код свой старый не найду, мне лень но я попросил chatgpt все написать, и о чудо, bing copilot не справился (отвратительно, майкрософт испортила хороший инструмент) хотя он понял концепцию но умудрился наделать кучу ошибок, пришлось чинить, в прошлом году он прекрасно с таким простым кодом справлялся. Не так, если воспользоваться площадкой для ботов coze, там используется gpt4, то результат получается верным (нет он тоже напортачил в подсчете смещения в массиве), это именно майкрософтовский сопилот тупой
template<typename T,size_t RowNum, size_t ColNum>
class Array2D {
private:
T arr[RowNum*ColNum];
public:
class Proxy
{
private:
T* _arr;
public:
Proxy(T arr[]) : _arr(arr) {}
T& operator[](size_t index)
{
return _arr[index];
}
};
Proxy operator[](size_t index)
{
return Proxy(&arr[index*ColNum]);
}
};
typedef Array2D<int, 3, 5> mas35;
mas35 test()
{
return *(new mas35); // с этим нужно быть предельно осторожным, так как бездумно можно получить утечки памяти
}
int main()
{
mas35 a=test();
a[1][0] = 5;
// ...
return 0;
}