会员无法访问
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::f
到 Example
- 实施
Clone::f
在每个阶段,我们都会提供编译器需要继续进行的操作。
祝你好运。
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::f
到Example
- 朋友
- 实施
Clone::f
在每个阶段,我们都会提供编译器需要继续进行的操作。
祝你好运。