我正在开发解决大约100个方程的代码。大多数这些方程是在私有成员中计算的,因为最终用户并不关心它们。但是,现在我做。因此,当我开发代码时,我希望能够快速测试私有成员。
下面的代码给出了我想要的基本行为,但它不起作用(隐私问题)。如果这种行为成为可能,我将不胜感激。
// Includes
#include <stdio.h>
// I want a general test class that can access private members
template <class Name> class TestClass{
public:
TestClass(Name& input) : the_class(input){}
Name& operator()(){ return the_class; }
Name& the_class;
};
// The class I want to test
class ClassA{
public:
friend class TestClass<ClassA>; // I hoped this would do it, but it doesn't
ClassA(){}
private:
void priv(){ printf("a private function\n"); }
};
// Main function that preforms the testing
int main (){
ClassA a;
TestClass<ClassA> b(a);
b().priv(); // I want to do this
}
答案 0 :(得分:1)
你已经与TestClass<ClassA>
建立了友谊,但你却在main()
中宣称这种友谊。
您的选择是:
TestClass<>
the_class.priv()
中编写转发功能
main()
。)答案 1 :(得分:1)
有不同的方法。从高级别的角度来看,您可以在TestClass
适配器中提供与测试类型中相同的功能,并让它转发请求。另一个选择是与测试类建立友好关系,该测试类将在成员函数中实际执行测试。
下面的代码没有编译,它显示了要采取的方法,但细节已关闭。阅读Kerrek在评论中链接的文章以获取更多详细信息
最后,如果你想滥用你的C ++ - fu,你可以通过使用显式模板实例化和成员指针来打破访问说明符(我写的是我的头脑,它可能无法编译,但想法是有的......如果他们来的话,只是打击编译器错误):
template <typename T, void (T::*Ptr)() >
struct accessor {
typedef void (T::*ptr_t)();
static ptr_t ptr;
};
template <typename T, void (T::*Ptr)() >
accessor<T,Ptr>::ptr_t accessor<T,Ptr>::ptr = Ptr;
template accessor<ClassA, &ClassA::priv>;
typedef accessor<ClassA, &ClassA> priv_accessor;
int main() {
ClassA a;
(a.*priv_accessor::ptr)();
}
此处的方法使用模板实例化来中断访问,因为模板显式实例化的参数不检查访问(否则无法使用私有成员实例化该模板,因为显式模板实例化必须在命名空间级别发生,你不能成为名称空间的朋友)