Помимо других проблем (конструктор копирования и т. Д.), Если вы хотите получить доступ к impl::data
без наложения заголовка <string>
на все ваши клиенты, вы можете сделать что-то вроде следующего:
// Foo.h
class FooUtil;
class Foo
{
friend class FooUtil;
private :
struct impl ;
impl * pimpl ;
};
// FooUtil.h
#include <string>
class FooUtil
{
public:
static std::string data_of(const Foo&);
};
// Foo.cpp
struct impl { std::string data; }
std::string FooUtil::data_of(const Foo& foo)
{
return foo.impl->data;
}
//main.cpp
Foo A;
Foo B;
Это обходной путь для использования функции-члена std::string Foo::data() const
. Идея заключается в том, что заголовок <string>
может быть включен только теми клиентами, которым он нужен.
Отказ от ответственности : мне действительно не нравится этот подход. Это очень не элегантно и вряд ли действительно увеличит время компиляции. Некоторые компиляторы кэшируют (или прекомпилируют) заголовки стандартных библиотек, чтобы помочь людям избежать такого беспорядка.