如何避免C++里的友元函数难题

作者:佚名        

原文链接:http://googletesting.blogspot.tw/2007/10/tott-avoiding-friend-twister-in-c.html


在上一节课,我们在Python中提取方法来简化测试。这些提取的方法作为私有类成员是有用的,但是要如何编写产品代码使它不依赖于测试代码?在Python中这个很简单;但是在C++中,测试私有成员比扭扭乐需要更多的扭曲。

// my_package/dashboard.h
class Dashboard {
 private:
scoped_ptr<Database> database_; // 构造函数实例化
//声明函数GetResults(), GetResultsFromCache(),
// GetResultsFromDatabase(), CountPassFail()
  friendclass DashboardTest;// 每个测试中声明一个friend
 // 固定的
};

可以通过提取类和提取接口的重构,用来创建一个包含实现的辅助类。在原始类的.h文件中提前声明新的接口,并且在原始类创建一个接口的指针。(这个和Pimpl惯用法类似。) 可以通过把标题分离成不同的子目录来区分公共API和和实现细节。(/my_package/public/ and/my_package/ in this example):

// my_package/public/dashboard.h
class ResultsLog; // 辅助性接口
classDashboard {
public:
explicitDashboard(ResultsLog* results) : results_(results) { }
 private:
  scoped_ptr<ResultsLog> results_;
};
// my_package/results_log.h
classResultsLog {
 public:
  // 声明方法 GetResults(),
  // GetResultsFromCache(),
  // GetResultsFromDatabase(), CountPassFail()
};

// my_package/live_results_log.h
classLiveResultsLog : public ResultsLog {
 public:
 explicitLiveResultsLog(Database* database)
      : database_(database) { }
};
 

现在不需要友元声明就可以测试 LiveResultsLog。当测试Dashboard 类的时候,也让你可以写入 MockResultsLog 实例。对原始类来说这些功能还是私有的, 并且对辅助类的使用可以对比较小的类更好的定位问题的所在。

词语解释:

1.Pimpl惯用法:基本思想是使用一个结构将原有接口class的私有数据成员和一些不希望被外界调用的数据成员操作的过程封装起来,此时class的私有成员看起来就想这样的:

private:

struct Member;

Member *data_member;

2.twister:一种游戏,叫做扭扭乐。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值