2

在我的程序中,我正在将一块文本绘制到屏幕上,并且我希望能够找到与给定像素对应的文本。在我的架构中,有两个类,thetext_viewdraw_device. draw_device是一个抽象基类,它提供绘图功能以及以像素为单位计算给定文本块大小的功能。text_view是一个类,用于存储有关块和文本行在屏幕上的位置的信息,以加快查找和重绘操作。

由于text_view存储了像素信息,所以必然依赖于 的选择draw_device。如果使用不同draw_device的,它可能会以不同的方式呈现文本并使text_view存储处于不一致的状态。

我的问题是,如何最好地代表这种关系?

我可以让这两个类的用户处理它,并draw_device为每个调用的函数传递一个引用。他们需要始终传递相同的类型,draw_device否则会发生邪恶。

class text_view{
public:
    void rearrange_text(const draw_device &);
    int lookup_text(const draw_device &, int x, int y) const;
    void draw_text(draw_device &) const;
};

我可以在 中保留一个裸指针text_viewdraw_device简化函数接口,但代价是要求类的用户处理管理生命周期问题

class text_view{
    draw_device * device;
public:
    void rearrange_text();
    int lookup_text(int x, int y) const;
    void draw_text() const;
    void change_draw_device(draw_device *);
};

我可以保留 a shared_ptrtext_view这样用户就不必担心生命周期问题,但代价是迫使他们使用 ashared_ptr而不是堆栈分配unique_ptr等。

我不喜欢该shared_ptr解决方案,因为我认为text_view不应拥有draw_device. 它只是它的用户。

4

0 回答 0