【问题标题】:friend member function can't access private member data好友会员功能无法访问私人会员数据
【发布时间】:2021-01-02 09:57:08
【问题描述】:

我尝试使用友元函数访问 X 类的私有成员数据,该友元函数本身是 A 类的成员函数。
代码如下:

class X {
    int foo;
public:
    friend void A::func(X x1);
};

class A {
public:
    void func(X x1) { x1.foo = 999; }
};

这不会编译,原因是:
Error C2248 'X::foo': cannot access private member declared in class 'X'

我尝试更改顺序,在 X 之前声明 A,但没有帮助..
这是什么原因造成的?

【问题讨论】:

  • 它无法编译,因为 A::func() 未声明。但是请不要在生产代码中写这样的东西所有人都会讨厌你。如果要了解朋友在做什么,那没关系...但是您几乎不需要那个...我看到的最实际的事情是当您需要实现operator<<operator>> 时。其他情况很可能是糟糕的代码设计
  • 无关,但请注意func() 正在修改传递给它的X 对象的副本。原始X 对象未修改。如果需要,请通过引用传递它:void func(X &x1)

标签: c++ friend friend-function


【解决方案1】:

您必须在 X 类之前定义 A 类,例如

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

或者代替前向声明

class X;

您可以使用详细的类型说明符,例如

class A {
public:
    void func(class X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

【讨论】:

    【解决方案2】:

    你必须正确拆分声明和定义,因为你有循环依赖:

    class X;
    
    class A {
    public:
        void func(X x1);
    };
    
    class X {
        int foo;
    public:
        friend void A::func(X x1);
    };
    
    void A::func(X x1) { x1.foo = 999; }
    

    Demo

    【讨论】:

      【解决方案3】:

      您忽略了另一个错误。即:

      错误:“A”尚未声明

      您需要先用函数声明类A,然后才能在X 中作为朋友引用它。但是,函数需要一个X,所以你还需要先声明X

      应该是这样的:

      class X;
      
      class A {
      public:
          void func(X x1);
      };
      
      class X {
          int foo;
      public:
          friend void A::func(X x1);
      };
      
      void A::func(X x1) { x1.foo = 999; }
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 2021-08-05
        相关资源
        最近更新 更多