C ++是否可能具有动态默认数据成员

时间:2018-11-20 17:59:14

标签: c++ overloading anonymous-class anonymous-inner-class

我想制作一个可以重载数组访问运算符的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]);
}

0 个答案:

没有答案