Я хотел бы создать класс Image, который может перегружать операторы доступа к массиву, поэтому вы можете сделать что-то вроде:
Image<unsigned long> img(100, 100); // an image 100x100
unsigned long middlePixel = img[50][50]; // access at (50,50)
Чтобы разрешить второй оператор доступа к массиву, у меня быловернуть структуру 'proxy', в которой снова есть перегрузка другого оператора доступа к массиву.
(в классе Image):
inline auto operator[] (int x)
{
struct
{
T *col;
inline T operator[] (int y) { return col[y]; }
} proxy{ raster[x] };
return proxy;
}
Это решение в настоящее время работает;однако он представляет столбец изображения col как открытый член анонимной структуры.Я хотел бы сделать этот анонимный класс так, чтобы 'col' был приватным (или сделать сам член приватным в структуре).
Проблема в том, что я не уверен, как инициализировать 'col'.Я понимаю, что я также могу установить 'col' с помощью функции set в анонимной структуре, но я хотел бы создать анонимную структуру, в которой будет показана только перегрузка доступа к массиву.
Я надеялся, что смогу выполнитьчто-то вроде этого (ofc не компилируется):
inline auto operator[] (int x)
{
class
{
T *col = raster[x];
public:
inline T operator[] (int y) { return col[y]; }
} proxy;
return proxy;
}
Возможно ли такое решение, не называя мою структуру?
Код ссылки:
template <class T = unsigned long>
class Image
{
private:
int width, height;
T **raster;
public:
Image(const int width, const int height) : width(width), height(height)
{
raster = new T*[height];
for (int y = 0; y < height; y++)
raster[y] = new T[width];
}
~Image()
{
for (int y = 0; y < height; y++)
delete[] raster[y];
delete[] raster;
}
inline auto operator[] (int x)
{
struct
{
T *col;
inline T operator[] (int y) { return col[y]; }
} proxy{ raster[x] };
return proxy;
}
};
Редактировать (решение с использованием именованной структуры):
inline auto operator[] (int x)
{
class Col
{
T *col;
public:
Col(T *col) : col(col) {};
inline T operator[] (int y) { return col[y]; }
};
return Col(raster[x]);
}