【问题标题】:access protected member from separate class从单独的类访问受保护的成员
【发布时间】:2014-06-19 20:40:27
【问题描述】:

这是对我正在使用的内容的过度简化,因为有很多代码。所以我有两节课。 A 是 Aa 的父级,X 是 Xx 的父级。我将父 A 设置为 X 和 Xx 的朋友类,以便我可以访问其私有和受保护的变量。现在因为 Aa 是 A 的孩子并且从 A 继承,为什么我不能访问 X 或 Xx 的受保护成员? A 是一个朋友班,所以这不应该工作吗?我总是收到一条错误消息,说 barA 是 X 的受保护成员。

class A {
    friend class X;
    friend class Xx;
public:
    void FooA();
protected:
    int fooA;
};

class Aa: public A {
public:
    voif Fooa();
private:
    int fooa;
};

class X {
public:
    void BarA();
protected:
    int barA;
};

class Xx: public X {
public:
    void Bara();
private:
    int bara;
};

【问题讨论】:

  • 如果没有更好的选择,您应该使用朋友作为最后的解决方案。您可以检查是否适用更好的设计。

标签: c++


【解决方案1】:

当您编写friend class X; 和friend class Xx; 时,这意味着X 和Xx 的成员函数可以访问A 类的私有成员和受保护成员。看来您想要反过来。为此,您应该在 X 和 Xx 类中添加 friend class Aa。

【讨论】:

  • 完美!非常感谢。
【解决方案2】:

友谊不是遗传的,也是单向的。您还必须将子类设为friend。

此外,在您当前的声明中,X 可以访问 A 的私​​有成员,但反之则不行。

正如另一个答案所说,您需要将friend class Aa; 添加到X 类中。 如果您希望A 也可以访问X 的成员,那么您还需要将friend class A; 添加到X 中。

【讨论】:

    【解决方案3】:

    你说,

    我将父 A 设置为 X 和 Xx 的朋友类,以便我可以访问其私有和受保护的变量。

    这是对friend 对类的作用的错误理解。进行人类比较以更了解它。

    假设你信任你的朋友约翰。你把你家的钥匙给他。约翰随心所欲地进出你的房子。你让约翰成为“朋友”。但是,这并不能让您进入约翰的房子。约翰没有把他家的钥匙给你。他没有给你你给他的“朋友”。

    就您而言,A 已将friend-ship 授予X 和Xx。 X 和Xx 可以轻松访问A 的私人部分。这不会让A 访问X 和Xx 的私有部分。只有 X 和 Xx 可以授予 friend-ship -- 通过声明

    friend class A;
    

    在类定义中。

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2012-12-01
      • 2017-08-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2010-09-16
      相关资源
      最近更新 更多