获得私有成员的访问权限以便在C ++中进行测试

时间:2012-07-13 18:24:12

标签: c++ testing private

我正在开发解决大约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
}

2 个答案:

答案 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)();
}

此处的方法使用模板实例化来中断访问,因为模板显式实例化的参数不检查访问(否则无法使用私有成员实例化该模板,因为显式模板实例化必须在命名空间级别发生,你不能成为名称空间的朋友)