Так что я думал о PIMPL и распределении стека.Я писал библиотеку и решил использовать PIMPL, чтобы скрыть закрытого члена класса.Это означает, что я бы объявил класс, подобный этому
class Foo {
private:
class Handle;
std::tr1::shared_ptr<Handle> handle;
public:
Foo();
};
Это довольно просто.Но затем в конструкторе вы делаете это
Foo::Foo() : handle(new Handle()) {}
Поэтому, когда кто-то, использующий мою библиотеку, создает Foo в стеке, он, по сути, все равно выполняет выделение кучи.Это компромисс, с которым вам придется жить при использовании PIMPL?Я думал о выпуске документации с предупреждением рядом с конструкторами: «ПРЕДУПРЕЖДЕНИЕ: это приводит к выделению кучи» или что-то подобное.
Моя другая мысль состояла в том, чтобы все классы, представленные для реализации, представляли собой чисто виртуальные интерфейсы, и целую кучу статических фабричных методов, возвращающих умные указатели.Это также означает выделение кучи, но в этом нет ничего хитрого.
Есть мысли или предложения?Я слишком внимателен к программистам, использующим мою библиотеку?