在我的程序中,我正在将一块文本绘制到屏幕上,并且我希望能够找到与给定像素对应的文本。在我的架构中,有两个类,thetext_view和draw_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_view来draw_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_ptr,text_view这样用户就不必担心生命周期问题,但代价是迫使他们使用 ashared_ptr而不是堆栈分配unique_ptr等。
我不喜欢该shared_ptr解决方案,因为我认为text_view不应拥有draw_device. 它只是它的用户。