0

У меня есть класс, назовем его продуктом, реализация которого я хочу полностью скрыть от пользователя. Тем не менее, я хотел бы, чтобы пользователь собирал продукты, передавал их, в общем, решать, что с ними делать, не зная, что внутри.Скрытие реализации форвардным объявлением

Первой мыслью, которая пришла мне на ум, было просто создать класс ProductFactory и переслать объявление класса Product в заголовок ProductFactory.h.
Объект класса Product будет создан методом makeProduct, который возвращает общий указатель на класс Product. Пользователь тогда не сможет увидеть, что внутри, но он может, например, отправить его в класс Service, который в своей реализации будет включать полное определение продукта, чтобы он мог получить доступ к своим кишкам.
Считаете ли вы, что это хорошая идея или она скорее похожа на обходной путь?

Я также думал об использовании идиомы pimpl, если мне нужна была какая-то функциональность верхнего уровня, к которой пользователь мог получить доступ, например operator ==, чтобы пользователь мог проверить, одинаковы ли продукты.

Обратите внимание, что абстрактный базовый класс не является опцией, потому что на самом деле нет интерфейса, который будет ограничен, достаточно ограничен для пользователя и достаточен для класса Service, например.

+2

Проблема заключается в том, что компилятор (и, следовательно, каждый, использующий класс) * нуждается в *, чтобы видеть все публичные объявления. Если компилятор не может их видеть, он не будет знать о том, что есть у публичных членов, поэтому вы фактически не можете называть какие-либо публичные функции в классе. Я бы сказал, иди за идиомой прыгуна, если хочешь скрыть частные части. –

ответ

2

Если операции, которые shared_ptr дает вам, достаточны для пользователя (например, должен быть оператор ==), то это решение должно быть способом.

Если вам нужно больше, чем это, то pimpl звучит как хороший способ, так как вы можете определить операции, которые нужны пользователю в вашем классе, и определить операции, которые ваш класс обслуживания нуждается в импланте. Здесь вы можете использовать интеллектуальные указатели, чтобы облегчить жизнь.

+0

Да, идиома PIMPL в сочетании с умными указателями должна быть в этом случае. Ссылка: http://herbsutter.com/gotw/_100/ –

Смежные вопросы