我下面是类层次结构。基本上,我想在类Foo和CComplexMat之间建立一个“has-a”关系,即类Foo“has-a”CComplexMat。
据我所知,无法从定义它们的类外部访问类的private
和protected
成员。
但是,允许其他类访问此类成员有两种可能性。
第一个是使用friend
类。我可以在friend class Foo<T>;
的声明中添加一行class CComplexMat<T>
,以便这样做
Foo<T>
可以访问protected
的{{1}}和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
答案 0 :(得分:4)
继承只应用于“is-a”关系。我认为CComplexMat<T>
有两个CMatrix<T>
成员,但事实并非如此“是一个”CMatrix<T>
。与Foo
和CComplexMat<T>
类似的处理。
因此,继承几乎肯定不是正确的解决方案。离开:
friend
允许在密切相关的类之间进行访问。例如,CComplexMat<T>
应该有真实和虚构部分的私有成员,但也有一些访问者,如:
public:
const CMatrix<T>& realPart() const;
CMatrix<T>& realPart();
const CMatrix<T>& imagPart() const;
CMatrix<T>& imagPart();
答案 1 :(得分:0)
您正在Foo类中访问CComplexMat的局部变量,而不是仅访问父类以获取pReal的值。
这个tutorial打破了C ++中友谊和继承之间的差异 请注意他们如何直接访问父类的成员变量,而没有父类类型的本地成员。这可能是您想要在示例中执行的操作。
答案 2 :(得分:0)
即使尝试访问的类是包含受保护成员的类的子类,也无法从类外部访问受保护的成员。
在您的示例中,如果pComplex指向Foo类型的对象,则可以按照您尝试的方式访问pReal。
答案 3 :(得分:0)
根据C ++标准,关于派生类中受保护成员的访问(11.5)
除了形成指向成员(5.3.1)的指针外,访问必须通过a 指向派生类本身(或从该类派生的任何类)的指针,引用或对象
您正尝试通过基类访问pReal。
让CComplexMat的Foo朋友访问它的成员。