C ++ Возможно ли иметь динамические элементы данных по умолчанию - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы создать класс 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]);
}
...