友元类或者友元函数需要在友元所属的类的外围作用外声明 或者 所属的类的最内层的作用域内定义。
如果是第一种情况,则需要在所属类定义以后,在声明的作用域中定义这个友元类或者友元函数。也就是具有以后的结构:
作用域A{
友元类或者友元函数的声明;
}
作用域B{
友元所属类的定义;
}
作用域A{
友元类或者友元函数的定义;
}
实例:
#include <iostream>
namespace B
{
class A;
}
namespace C{
void accessi(B::A a );
}
/*void accessi()
{
std::cout<<i;
}*/
namespace B{
class A
{
public:
A()
{
i = 1;
}
friend void C::accessi(A a);
private:
int i ;
};
}
namespace C{
void accessi(B::A a)
{
a.i = 2;
std::cout<<a.i;
}
}
int main(int argc,char**argv)
{
B::A a;
C::accessi(a);
return 0;
}
如果是第一种情况,则需要在所属类定义以后,在声明的作用域中定义这个友元类或者友元函数。也就是具有以后的结构:
作用域A{
友元类或者友元函数的声明;
}
作用域B{
友元所属类的定义;
}
作用域A{
友元类或者友元函数的定义;
}
实例:
#include <iostream>
namespace B
{
class A;
}
namespace C{
void accessi(B::A a );
}
/*void accessi()
{
std::cout<<i;
}*/
namespace B{
class A
{
public:
A()
{
i = 1;
}
friend void C::accessi(A a);
private:
int i ;
};
}
namespace C{
void accessi(B::A a)
{
a.i = 2;
std::cout<<a.i;
}
}
int main(int argc,char**argv)
{
B::A a;
C::accessi(a);
return 0;
}