Я реализовал свой класс, скажем, класс A
, используя стандартную идиому PIMPL.
Проблемы возникает, когда я пытаюсь перегрузкой <<
оператора для моего класса реализации AImpl
Проблема доступности идиомы PIMPL
/* A.h */
class A {
public:
...
private:
class AImpl;
AImpl *impl;
}
/* Aimpl.h */
class AImpl {
...
friend ostream &operator <<(ostream &os, const AImpl &impl);
...
}
/* elsewhere.cpp */
ostream &operator <<(ostream &os, const AImpl &impl) {
...
}
Проблемы связана с перегруженным оператором, не имея доступ к AImpl
классу, объявленной рядовому в A
.
Теперь я вхожу в дилемму о том, как я должен это решить. Один из способов - объявить перегруженного друга оператора класса A
. Другой способ - сделать частное объявление класса AImpl
общедоступным.
Какой подход лучше и безопаснее?
Да еще один способ определить 'operator <<' внутри 'AImpl', а не просто объявить его. В любом случае, чаще всего с помощью pImpl класс «Impl» лучше всего помещается в «A.cpp», и нет никакой пользы и значительной многословности от сохранения разглашений деклараций и определений. –
Это для сериализации или печати? Обычно вы не хотите печатать частные части своего класса, поэтому вам нужен только оператор << для A, который даже не должен быть другом. – MikeMB
Как/почему у вас есть доступ к {{AImpl}} в любом месте, кроме {{A.cpp}}? –