我有下面的类层次结构。基本上,我想在类Foo和CComplexMat之间建立“具有”关系,即,在类Foo中“具有-a” CComplexMat。
据我所知,无法从定义它们的类外部访问类的privateprotected成员。

但是,有两种可能性允许其他类访问此类成员。
第一个是使用friend类。我可以在friend class Foo<T>;的声明中添加一行class CComplexMat<T>,以便Foo<T>可以访问protectedprivateclass CComplexMat<T>成员。

第二种可能性是使用inheritance,这是我在示例中选择的解决方案。在这种情况下,我正在考虑public继承,以便publicprotectedclass CComplexMat<T>成员都可以在Foo<T>类中访问。但是,显示以下错误:
error: ‘CMatrix<float>* CComplexMatrix<float>::m_pReal’ is protectederror: 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>的情况。类似于FooCComplexMat<T>

    因此,继承几乎肯定不是正确的解决方案。留下:

  • 使用friend允许在密切相关的类之间进行访问。
  • 使用公共(public)访问器方法允许类的用户以有限的方式“获取”私有(private)成员。

  • 例如,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/

    10-10 13:35