Скажем, я создаю библиотеку libFoo, который предоставляет АНИ этот классMocking классы, которые используют Pimpl шаблон
class Book
{
public:
Book(string const& title, string const& author);
string const& title() const;
string const& author() const;
private:
struct Implementation;
std::shared_ptr<Implementation> impl_;
};
требуется использование Pimpl рисунка. Позже я понимаю, что пользователи моей публичной книги классов могут захотеть издеваться над ними, когда они пишут модульные тесты для своего собственного кода. Теперь им нужно затенять класс Book
, так как он не имеет виртуальных методов.
Итак, я хочу сделать класс Book
легко макет. Для этого у нас есть виртуализация или templatization (любопытно повторяющийся шаблон дизайна или hi-perf инъекции зависимостей). Каким будет преимущество каждого из них в контексте шаблона Pimpl? Для меня это выглядит не так, как иметь виртуальные методы для класса, реализующего шаблон Pimpl. С другой стороны, виртуализация публичного API libFoo сделает библиотеку макетной с минимальными изменениями. Что ждет меня «gotchas», если я выберу виртуализацию и Pimpl?
class Book
{
public:
Book(string const& title, string const& author);
virtual string const& title() const;
virtual string const& author() const;
private:
struct Implementation;
std::shared_ptr<Implementation> impl_;
};
_ «Что ж, меня ждут, если я выберу виртуализацию и Пимпл?» Я не вижу ничего. –
Я не рекомендую наследовать на основе mocking в C++ * вообще *, потому что есть слишком много возможностей для кого-то, у которого отсутствует ссылка где-то и недопустимые объекты, возникающие из неявных копий. классы pImpl являются * более безопасными * в этом отношении, потому что преобразование указателя, вероятно, не сработает – Caleth