У меня мало опыта в продвинутых ОО-методах, и я хочу разработать его как упражнение. Я думаю о реализации следующего и спрашиваю, правильно ли я поступаю.
У меня есть класс PImage
, который содержит необработанные данные и некоторую информацию, необходимую для файла изображения. Его заголовок в настоящее время выглядит примерно так:
#include <boost/filesytem.hpp>
#include <vector>
namespace fs = boost::filesystem;
class PImage
{
public:
PImage(const fs::path& path, const unsigned char* buffer, int bufferLen) :
path_(path), filesize_(bufferLen),
data_(buffer, buffer + filesize_),
width_(0), height_(0) {}
const vector<char> data() const { return data_; }
const char* rawData() const { return &data_[0]; }
/*** other assorted accessors ***/
private:
fs::path path_;
int filesize_;
vector<char> data_;
int width_;
int height_;
}
Я хочу заполнить width_
и height_
, просматривая заголовок файла. Тривиальное / неэффективное решение состоит в том, чтобы иметь большой беспорядочный поток управления, который определяет тип файла изображения (.gif, .jpg, .png и т. Д.), А затем соответствующим образом анализировать заголовок.
Вместо использования vector<char> data_
я думал о том, чтобы PImage
использовал класс RawImageStream data_
, который наследуется от vector<char>
. Каждый тип файла, который я планирую поддерживать, будет наследоваться от RawImageStream
, например RawGifStream
, RawPngStream
.
Каждый RawXYZStream
будет инкапсулировать соответствующие функции синтаксического анализа заголовка, а PImage
будет делать только что-то вроде height_ = data_.getHeight();
.
- Я правильно обдумываю это?
- Как мне создать правильный
RawImageStream
подкласс для data_
, который будет в PImage
ctor? Это где я мог бы использовать фабрику объектов?
- Что-нибудь, что я забыл?