我想制作一个可以重载数组访问运算符的Image类,因此您可以执行以下操作:
Image<unsigned long> img(100, 100); // an image 100x100
unsigned long middlePixel = img[50][50]; // access at (50,50)
为了允许第二个数组访问运算符,我不得不返回一个'proxy'结构,该结构再次具有另一个数组访问运算符重载。
(在图像类中):
inline auto operator[] (int x)
{
struct
{
T *col;
inline T operator[] (int y) { return col[y]; }
} proxy{ raster[x] };
return proxy;
}
该解决方案目前正在运行;但是,它将图像列“ col”公开为匿名结构的公共成员。我想将此类设为一个匿名类,以便“ col”是私有的(或使成员本身在结构中私有)。
问题是我不确定如何初始化'col'。我意识到我也可以在匿名结构中使用setter函数设置'col',但我想制作一个仅暴露数组访问重载的匿名结构。
我希望能够完成类似的事情(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]);
}