Я реализую несколько классов с использованием идиомы pimpl и сталкиваюсь с некоторыми проблемами при проектировании.
Во-первых, я всегда видел, как pimpl делается так:классы, использующие этот подход, и моя проблема заключается в том, что некоторым из этих классов требуется доступ к деталям реализации друг друга, но указатель _pimpl является частным.Очевидно, что если он публичный, то кто-то может случайно (или намеренно) переназначить его.(Я игнорирую тот факт, что «private» может быть определен как «public» как «public» и в любом случае предоставит доступ. Если вы сделаете это, то вы заслуживаете того, что получаете).и приветствовал бы любые комментарии в том же духе.
Мне очень не хочется использовать друзей, и я не уверен, что они даже помогут, так как вы не можете пересылать объявление Object :: ObjectImpl без полного определения Object.
то есть
...
private:
class ObjectImpl *_pimpl;
friend class OtherObject::OtherObjectImpl; // this needs a fully qualified OtherObject
};
Thx Mark.
* ОБНОВЛЕНИЕ - Подробнее **
У меня есть два класса, одинназывается команда, другой называется результаты.У меня есть методы для Command, которые возвращают вектор Results.
И Command, и Results используют идиому pimpl.Я хочу, чтобы интерфейс результатов был как можно меньше.
class Command
{
public:
void getResults( std::vector< Results > & results );
void prepareResults( std::vector< Results > & results );
private:
class CommandImpl *_pimpl;
};
class Results
{
public:
class ResultsImpl;
Results( ResultsImpl * pimpl ) :
_pimpl( impl )
{
}
private
ResultsImpl *_pimpl;
};
Теперь в Command :: getResults ().Я вставляю ResultsImpl в результаты.в Command :: prepareResults () мне нужен доступ к ResultsImpl.
M.