会员无法访问

时间:2015-07-14 15:02:35

标签: c++ friend

class Example{
public:
    friend void Clone::f(Example);
    Example(){
        x = 10;
    }
private:
    int x;
};

class Clone{
public:
    void f(Example ex){
        std::cout << ex.x;
    }
};

当我将f作为普通函数写入时,程序编译成功。但是,当我将f作为类成员编写时,会发生此错误。

屏幕截图:

1 个答案:

答案 0 :(得分:3)

您看到的错误不是根本原因编译错误。这是一个不同问题的神器。你正在与一个类的成员函数建立联系,编译器甚至不存在任何地球线索,更不用说该特定成员了。

非成员函数的friend声明具有以下优点:它还充当原型声明。对于成员函数来说,就是这种情况。编译器必须知道(a)类存在,(b)成员存在。

编译原始代码(我使用clang ++ v3.6),以下错误实际报告:

main.cpp:6:17: Use of undeclared identifier 'Clone'
main.cpp:17:25: 'x' is a private member of 'Example'

前者是后者的直接原因。但是改为这个

#include <iostream>
#include <string>

class Example;

class Clone
{
public:
    void f(Example);
};

class Example
{
public:
    friend void Clone::f(Example);
    Example()
    {
        x = 10;
    }

private:
    int x;
};

void Clone::f(Example ex)
{
    std::cout << ex.x;
};

int main()
{
    Clone c;
    Example e;
    c.f(e);   
}

<强>输出

10

执行以下操作:

  • 转发声明Example
  • 声明Clone,但未实施Clone::f(尚未)
  • 声明Example,从而使编译器知道x
    • 朋友Clone::fExample
  • 实施Clone::f

在每个阶段,我们都会提供编译器需要继续的内容。

祝你好运。