Недавно я писал код, подобный этому:Абстрактный класс - пряча реализация в C++ практике
messagehandler.h:
#include "message.h"
class MessageHandler {
public:
virtual ~MessageHandler() {}
virtual void HandleMessage(Message *msg) = 0:
};
persistmessagehandler.h:
MessageHandler *CreatePersistMessageHandler();
persistmessagehandler. cpp:
#include "messagehandler.h"
#include "persist.h"
class PersistMessageHandler : public MessageHandler {
private:
PersistHandle ph;
size_t count;
InternalCheck();
public:
PersistMessageHandler(int someParam);
virtual ~PersistMessageHandler();
virtual void HandleMessage(Message *msg):
};
PersistMessageHandler::PersistMessageHandler(int someParam)
{
ph.Initialize();
}
... rest of implementation.
MessageHandler *CreatePersistMessageHandler(int someParam)
{
return new PersistMessageHandler(someParam);
}
Здесь нужно скрыть PersistMessageHandler. Клиентам не нужно включать заголовок для класса PersistMessageHandler, при этом все включенные и типы реализации могут потребоваться, а также более четкое разделение интерфейса и реализации. . Это всегда будет динамически распределено,
Все пользователи PersistMessageHandler просто вызовут CreatePersistMessageHandler (..); прямо или косвенно получить его с завода.
Но. Я не видел, чтобы этот подход использовался в других местах. Является ли вышеуказанная хорошая практика? Существуют ли другие/лучшие альтернативы для простых случаев?
Почему кто-нибудь когда-либо сокращал «Сообщение» на «Messge»? Это опечатка? – unwind
Отличный вопрос! Я делаю это все время и всегда задавался вопросом, был ли он кошерным.За исключением моего объявления: 'std :: auto_ptr CreatePersistMessageHandler();' –
См. Также http://stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface – Frank