会员无法访问

Member is inaccessible

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 写为 class 成员时,会出现此错误。

截图:

您看到的错误不是根本原因编译错误。它是另一个问题的产物。您正在与 class 的成员函数交友,编译器甚至还没有现成的线索,更不用说那个特定成员了。

非成员函数的 friend 声明具有优势,因为它也可以作为原型声明。 不是成员函数的情况。编译器必须知道 (a) class 存在,并且 (b) 成员存在。

编译你原来的代码(我用的是clang++ v3.6),实际报如下错误:

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

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

#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

在每个阶段,我们都会提供编译器需要继续进行的操作。

祝你好运。