我一直在尝试访问基础项目中的类的私有成员,以便在另一个项目中对该类的public void方法进行单元测试。这些方法修改了私有成员,所以这是我的动机。我必须为visual studio 2008工作。
现在,Microsoft教程建议将基础项目编译为静态库,因为这样可以访问私有成员。 https://msdn.microsoft.com/en-us/library/hh419385.aspx但是,在添加项目的引用并将.lib输入到链接器之后,我仍然得到私有成员无法访问的错误。然而,.lib显然是被发现并阅读的。
当我将我的Test项目声明为基类中的友元类时,它按预期工作,但我试图在基本代码上尽可能少地改变(无)。
我只是想知道微软的建议背后是什么。它甚至应该工作吗?我的Visual Studio版本(= 2008)是问题吗?谢谢你的帮助。
我读到了访问私人会员的方法,但它们都非常混乱,而不是我的意思。例如:Can I access private members from outside the class without using friends?
答案 0 :(得分:0)
您阅读的Microsoft文档有一个由暑期实习生撰写并具有误导性的文字。
从目标文件构建静态库 从C ++源代码编译可以对C ++没有影响 访问类成员的状态。该访问状态由该类确定 头文件中的定义。是否将关联的对象文件放入任何类型 存档对头文件或类定义没有影响。
当你读到:
单元测试必须使用私有函数和数据, 并且可以将测试中的代码构建为静态库:
更改正在测试的项目,以便将其编译为.lib文件。 添加一个引用测试项目的单独测试项目。
私有数据和函数应该指(慈善解释)是数据和函数,这些数据和函数不会从DLL 动态链接中导出。 然而,这种非DLL导出的数据或功能可能仍然存在 具有外部(全局,公共)链接并且是C ++类的公共成员;并在 一般情况下,如果他们是C ++类的成员,那么他们必须具有公共或至少受保护的C ++访问权限 单元测试是在没有C ++友谊的情况下访问它们 在被测试的类中声明。
所以你已经找到的C ++友谊解决方案就像任何人一样正确。 您可以考虑使用预处理器和条件编译来制作 侵入性朋友声明仅存在于单元测试的上下文中 项目
但请留意@ BoPersson的评论。探测或 在单元测试中行使私人班级成员是一个值得怀疑的做法。 C ++类的明显行为完全由其公共/受保护接口定义。 那么你的单元测试与内部实现有什么关系呢?在继续之前找到令人信服的答案。