C++在类型封装中引入public/protected/private访问控制之后,对成员的混乱访问问题得到了纠正,但同时也带来了一个问题,就是作者自己也无法随意访问类中的成员。一个正在开发中的类是需要随时检查内部成员变量的,毕竟一个没有经过仔细调试的东西是不能保证正确的。
这个问题怎么解决呢?第一步,在开始设计一个类型时,可以先用struct。用struct声明的类,所有成员默认都是public属性的,这时可以随时检查内部成员变量的值,也可以随时调用各个成员函数,没有访问障碍。
当类型开发成型后,再改回class声明,然后内部加上public/protected/private访问控制说明。这时候,类的内部功能已经调试过了,只要防止外部用户对类型不规范的使用就好了。
当使用过程中,遇到错误,需要追踪bug时,可以再改回第一步,允许对所有成员访问。当然这样来回改是很不方便的,所以也可以临时添加一个友员类,友员是可以访问类的私有成员的。调试完了再删去就好了。
就像下面这个例子展示的那样。例子中base类和derived类都声明了同一个debug类是友员。这当然是可以的。友员中又声明了一个公有的静态函数print(),允许检查base类和derived类的内部数据。
#include <stdio.h>
class base
{
public:
base(){
x = 0; y = 0;}
base(int a){
x = a; y = 0;}
base(int a, int b){
x = a; y = b;}
private:
int x;
int y;
friend class debug;
};
class derived: public base
{
public:
derived(){
z = 0;}
derived(int a, int b, int c):base(a,b){
z = c;}
private:
int z;
friend class debug;
};
class debug {
public:
static void print(derived &d) {
printf("%%(%d,%d,%d)\n", d.x, d.y, d.z);
}
};
int main()
{
derived a;
derived b(1,2,3);
debug::print(a);
debug::print(b);
return 0;
}