В моей программе я рисую блок текста на экране и хочу найти текст, соответствующий данному пикселю. В моей архитектуре есть два класса, 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
, Это просто пользователь этого.
Задача ещё не решена.
Других решений пока нет …