C++要求在使用一个类型时必须见到它的声明,但在定义变量时必须看见整个类型的定义对吧?
那么
struct X;
void f(X x){} //是不被允许的
//但是
struct Y{
void f1(X x);//不报错
};//是不是只要在使用(定义)X的时候,编译器已经看见X的定义就行
//而在声明的时候是不要紧的?
还有 struct中
struct A{
private:
int i;
public:
struct B;
friend struct B;//书上说必须这样写(声明B为友元),B本身不会自动被允许访问 A的private成员
//可是我把上两行去掉了同样不报错,还有,书上说 声明了struct B;就可以用 friend B;声明友元但
//我测试失败,不写上 struct 就会报错
struct B{
A* x;
void f(){x->i=10;}//这里引用了A的私有成员
};
};
//注:我所说的书是《Thinking in C++ volume1》
c++ struct 访问权限
------解决方案--------------------------------------------------------
struct B;不是声明么?
先声明后定义是可以的。
struct是关键字。
而friend关键字声明友元类的语法是friend class somename;
友元可以访问类中的私有域。
至于void f(){x->i = 10;},你在struct A的public中定义结构B以及B的成员函数f(),那么f()应该算是A的成员函数了。你可以试下去掉friend看看
------解决方案--------------------------------------------------------
struct X;
void f(X x){} //是不被允许的, 因为f已经有实现"{}", 编译器要确定X的定义才能分配参数的栈内存分配和初始化/析构等
//但是
struct Y{
void f1(X x);//允许, 因为只是声明, 没有定义.
第二个问题没看明白你的意思.