c++ - OO 设计 - 多态性 - 如何设计处理不同文件类型的流

标签 c++ oop polymorphism

我对高级 OO 实践经验不多,我想将其设计为一个练习。我正在考虑实现以下内容,并询问我是否以正确的方式进行此操作。

我有一个类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 等),然后相应地解析 header 。

而不是使用 vector<char> data_ , 我在想 PImage使用一个类,RawImageStream data_继承自 vector<char> .我计划支持的每种文件类型都将从 RawImageStream 继承。 ,例如RawGifStream , RawPngStream .

每个RawXYZStream将封装相应的 header 解析函数,并且 PImage只需要做类似 height_ = data_.getHeight(); 的事情.

  1. 我考虑的是否正确?
  2. 我将如何创建合适的 RawImageStream data_ 的子类在PImage Actor ?这是我可以使用对象工厂的地方吗?
  3. 有什么我忘了的吗?

最佳答案

是的,您可以按照您描述的方式实现您的类层次结构。尽管如此,我可能会直接从 PImage 派生 PngImage、GifImage 和 JpegImage。然后 PImage 可以变得抽象:

class PImage
{
  virtual ~PImage {}
  virtual unsigned int getWidth() const = 0
  virtual unsigned int getHeight() const = 0
  ...
};

然后,每个具体图像类型实现 getWidth 和 getHeight。

然后 PImage 类可以由 PImage 工厂创建:

boost::shared_ptr<PImage> createImage(const fs::path& path);

在工厂中,您几乎可以打开文件,查看它的类型,然后创建具体的图像类,在构造函数中传递数据,最终将图像作为抽象 PImage 返回。

最后,我想补充一点,你不应该对你的设计过于担心,当你发现你的设计不能满足你的需求时,准备好重构。通过反复试验,您会逐渐了解哪种设计适合您的问题!

关于c++ - OO 设计 - 多态性 - 如何设计处理不同文件类型的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2458617/

相关文章:

php - 在 PHP 中访问同级 (?) 变量

c# - 最有效的面向对象的 4 路温度转换器方法

java - Springfox/Swagger 不解析多态字段

c++ - 继承实现不起作用

c++ - 防止两个对象内部发生别名

c++ - 添加 vector 元素的所有排列

C++ 二维数组类函数调用帮助

C++ 指向派生类对象的基类指针不调用派生等于运算符函数

c++ - 当调用函数发生异常时,如何确保数组在函数内部被删除?

c# - 如何在 Windows 8 的桌面应用程序中访问 Metro 应用程序的本地存储?