我有下面的类层次结构。基本上,我想在类Foo和CComplexMat之间建立“具有”关系,即,在类Foo中“具有-a” 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;
...
};
最佳答案
继承只能用于"is"关系。在我看来,CComplexMat<T>
具有两个CMatrix<T>
成员,但不是"is" CMatrix<T>
的情况。类似于Foo
和CComplexMat<T>
。
因此,继承几乎肯定不是正确的解决方案。留下:
friend
允许在密切相关的类之间进行访问。 例如,
CComplexMat<T>
可能应该具有实部和虚部的私有(private)成员,但是还应具有一些访问器,例如:public:
const CMatrix<T>& realPart() const;
CMatrix<T>& realPart();
const CMatrix<T>& imagPart() const;
CMatrix<T>& imagPart();
关于c++ - 友元与继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4821268/