0

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

2 回答 2

1

您已授予 友谊TestClass<ClassA>,但您却在坚持这种友谊main()

您的选择是:

  • 编写一个转发函数TestClass<>调用the_class.priv()
  • 为实际需要它的功能授予友谊。(我想这实际上不在 main()的实际程序中。)
于 2012-07-13T18:30:23.377 回答
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)();
}

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

于 2012-07-13T18:38:48.983 回答