c++ - 图像类层次结构的设计建议

标签 c++ oop

我需要一些关于 Image 类层次结构的设计建议。
目前,我有两种类型的图像(一种是标准图像,第二种不包含标准图像数据)。 有时我希望对象为图像数据分配内存,而其他时候我只是希望它指向它。

当我想为 TypeA 图像赋予特定功能时,问题就出现了。
如果 TypeA 图像继承自图像,我将不得不复制已分配图像与未分配图像的功能。

我确信有更好的方法来做到这一点,我记得在大学期间有一些使用 mixins 的优雅解决方案,但在这里找不到使用它的方法。

我目前的设计是这样的:

class Image
{
public:
Image(int width, int height, int bpp);
virtual ~Image() {};
    // getters

    template <typename T>                                  
    T* ptr() { return reinterpret_cast<T*>(m_imageData); } // T depends on bpp

 protected:
    // metadata
    char* m_imageData;
};

class AllocImage : public Image
{
public:
    AllocImage(int width, int height, int bpp, DataType dataType) :
        Image(width, height, bpp, dataType)
    {
        m_imageData = new char[m_dataSize];
    }

    ~AllocImage()
    {
        delete m_imageData;
    }
};

class ImageHolder : public Image
{
public:
    ImageHolder(int width, int height, int bpp, DataType m_dataType);

    void setPtr(const void* ptr);
};

class AllocatedImageTypeA : public AllocImage
{
public:
    // Type A specific methods
};

class NonAllocatedImageTypeA : public ImageHolder
{
public:
    // duplicated Type A specific methods
};

最佳答案

如果所有差异都限于图像的保存方式(分配或不分配),您可以使用 policy model .

简短的解释是,您将向图像传递一个策略对象,其中该策略描述了您是否需要释放图像、如何访问它等,基本上是与由图像引起的差异相关的任何内容如何保存图像数据(分配与指向)。然后您对图像的所有访问都将通过该策略。

例如,而不是写

delete image;

你会写:

policy.del(image);

policy.del 可以是 delete 的委托(delegate)或空操作,具体取决于策略的实际类型(即符合图像的内容需要)

关于c++ - 图像类层次结构的设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10397361/

相关文章:

java - 将 std*** 从 C++ 重定向到 Java 以进行日志记录

当函数 arg 类型是类接口(interface)时,C++ 无法传递对指针的引用

javascript - oop:点击事件

c++ - 什么是字符*?

c++ - 循环依赖修复

c++ - 全局 operator<< 和成员 operator<< 共存

java - 为什么一个对象应该有一个返回 "this"的方法?

oop - 解释这张关于依赖倒置原则的励志海报

java - 通用接口(interface)的多种实现

c++ - 如何设计适合数百万分配的类?