我已經實現了我的課程,可以說使用標準PIMPL成語的課程A
。當我嘗試過載<<
運營商爲我實現類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
的私人申報。
哪種方法更好更安全?
是的另一種方法是在'AImpl'裏面定義'operator <<',而不是隻聲明它。通常,對於pImpl,「Impl」類最好放置在「A.cpp」中,並且保持聲明和定義分離的效果很小,並且相當冗長。 –
這是用於序列化還是打印?通常,你不想打印你班級的私人部分,所以你只需要一個操作符<< for A,它甚至不必是朋友。 – MikeMB
無論如何,您爲什麼要訪問{{AImpl}} {{A.cpp}}以外的任何地方? –