在我的程序中,我正在将一块文本绘制到屏幕上,并且我希望能够找到与给定像素对应的文本。在我的架构中,有两个类,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
. 它只是它的用户。