在我的程序中,我正在绘制一个屏幕文本块,我希望能够找到与给定像素对应的文本。在我的架构中,有两个类,text_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 *);
};
我可以在shared_ptr
中保留text_view
,这样用户就不必担心生命周期问题,代价是强制他们使用shared_ptr
代替堆栈分配或unique_ptr
等。
我不喜欢shared_ptr
解决方案,因为我认为text_view
不应该拥有draw_device
。它只是它的用户。