gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:52 27 4
gpt4 key购买 nike

我对高级 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com