2016-07-28 11 views
0

У меня возникла проблема, к которой я не нашел простого решения.Дизайн класса C++ - Условные типы данных

У меня есть класс изображения:

class Image 
{ 
public: 
      Image(); 
      ~Image(); 
private: 
      int    m_rows; 
      int    m_cols; 

      int    m_bGray; 
      /* HOW TO IMPLEMENT THIS? 
      if(m_bGray) 
        std::vector<std::vector<unsigned char>> m_data; 
      else 
        std::vector<std::vector<std::vector<unsigned char>>> m_data;*/ 

      BITMAPFILEHEADER  *m_bmpHeader;  // store headers in case we need to write back to HDD 
      BITMAPINFOHEADER  *m_bmpInfo; 
}; 

Мой объект класса будет либо R-G-B или серый в любой данный момент времени.

Означает ли это требование сохранения указателя на необработанные данные и управления памятью и освобождением памяти? Если да, я бы пошел arrays, чем vectors

Есть ли идиома, которая имеет прямое решение для таких сценариев?

+4

Один подкласс для серого и другого цвета? – John3136

+0

Вопрос: Что, если какой-то код выполняет 'm_bGray =! M_bGray;'? Вы смешиваете переменную времени выполнения с хранилищем времени компиляции. – luk32

+1

Как в сторону. При хранении триплета rgb. Вы можете избежать вложенного вектора. Вы знаете, что это будет структура, содержащая 3 uchars. Таким образом, вы можете использовать вектор 'std :: tuple' или определенный' rgb' struct/class. –

ответ

0
template<bool m_bGray> class Image; 
template<> class Image<false> { 
    std::vector<std::tuple<unsigned char, unsigned char, unsigned char>> m_data; 
}; 
template<> class Image<true> { 
    std::vector<unsigned char> m_data; 
}; 

Возможно, вам необходимо более точно узнать, как вы ожидаете, что ваши изображения будут использоваться и обрабатываться. Комментарий John3136 может быть тем, что вам нужно.