Ниже приведена иерархия классов.По сути, я хотел бы установить отношение «имеет-а» между классами Foo и CComplexMat, то есть класс Foo имеет -А «CComplexMat».Из того, что я знаю, private
и protected
члены класса не могут быть доступны извне класса, в котором они определены.
Однако есть две возможности разрешить другим классам доступ к таким членам.Первый - использовать friend
классы.Я мог бы добавить строку friend class Foo<T>;
в объявлении class CComplexMat<T>
, чтобы Foo<T>
мог получить доступ к protected
и private
членам class CComplexMat<T>
.
Второй возможностью было бы использоватьinheritance
, это решение, которое я выбрал в примере.В этом случае я рассматриваю наследование public
, чтобы оба члена public
и protected
из class CComplexMat<T>
были доступны в классе Foo<T>
.Однако отображается следующая ошибка:
error: ‘CMatrix<float>* CComplexMatrix<float>::m_pReal’ is protected
error: within this context
- Мне было интересно, может кто-нибудь пролить свет на ошибку?
- В каких ситуациях «дружба» или «наследство» более подходят?
template <class T>
class CMatrix{
public:
...
CMatrix<T> & operator = (const CMatrix<T> &);
T & operator()(int, int, int);
T operator()(int, int, int) const;
...
private:
T *** pData;
int rows, cols, ch;
};
template <class T>
class CComplexMat: public CMatrix<T>{
public:
...
protected:
CMatrix<T> *pReal;
CMatrix<T> *pImag;
};
template <class T>
class Foo: public CComplexMat<T>{
public:
...
void doSomething(){
...
CMatrix<T>*pTmp = pComplex->pReal; // error here.
...
}
...
private:
CComplexMat<T> * pComplex;
...
};