C++ 友元类

友元
(1)是C++提供的一种破坏数据封装和数据隐藏的机制
(2)通过将一个模块声明为另一个模块的友元,一个模块能引用到另一个模块中本是被隐藏的信息
(3)可以使用友元函数和友元类
(4)为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元

最近使用友元类的一个方向就是做UT/IT(单元测试,集成测试),因为需要自己设定一些数据的值,可能被测目标函数会用到一些私有或全局变量,如果需要对这些数据的值进行改变,要么就是将私有程序类型改为共有类型,这样就好修改被测目标文件,此时,更好的方式就是使用友元类,下面是一个使用的简单的例子。

getVolume.cpp是我们需要测试的源文件,主要对getVolume()、getArea()这两个函数进行测试,由于被测源文件成员函数及成员变量全部为私有类型,从外部无法调用,此时就需要使用友元类来创造数据和测试函数。

getVolume.h

#include <iostream>
using namespace std;
 
class Box
{
public:
	  friend class BoxCaller;
private:
      double getVolume(void);
	  double getArea(void);
   
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

getVolume.cpp

#include <iostream>
#include "getVolume.h"
using namespace std;
 
double Box::getVolume(void)
{
    return length * breadth * height;
}

double Box::getArea(void)
{
    return length * breadth;
}

测试文件test.cpp

#include <iostream>
#include "getVolume.h"

using namespace std;

class BoxCaller
{
public:
	//设置长宽高
    void setLength( double len ){
        box.length = len;
    }
    void setBreadth( double bre ){
        box.breadth = bre;
    }
    void setHeight( double hei ){
        box.height = hei;
    }

	//获取长宽高
	double getLength(){
        return box.length;
    }
	double getBreadth(){
        return box.breadth;
    }
	double getHeight(){
        return box.height;
    }

	//获取体积
	double getVolume(){
		return box.getVolume();
	}
	//获取面积
	double getArea(){
		return box.getArea();
	}

private:
      Box box;
};

int main()
{
	BoxCaller caller;
	caller.setLength(5);
    cout << "length : " << caller.getLength() << endl;

    caller.setBreadth(6);
    cout << "breadth : " <<  caller.getBreadth() << endl;

	caller.setHeight(7);
    cout << "height : " << caller.getHeight() << endl;

	double volume = caller.getVolume();
	cout << "volume : " << volume << endl;

	double area = caller.getArea();
	cout << "area : " << area << endl;
	return 0;
}

 

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页