如何轻松公开我是朋友的 C++ 类的所有私有成员?

bed*_*rom 3 c++ private friend

我有以下课程:

class Foo
{
friend class FriendFoo;
private:
    int private_number1;
    int private_number2;
    int private_function1();
    int private_function2();
};

class FriendFoo
{
public:
    Foo& foo;
    FriendFoo(Foo& foo_) : foo(foo_)
    {
    }

    // I don't want to write the following adaptors:
    int getPrivateNumber1()
    {
        return foo.private_number1;
    }

    int getPrivateNumber2()
    {
        return foo.private_number2;
    }

    int private_function1()
    {
        return foo.private_function1();
    }

    int private_function2()
    {
        return foo.private_function2();
    }
};
Run Code Online (Sandbox Code Playgroud)

问题:

我想通过 访问Foo来自外部的所有私有成员FriendFoo,但我不想FriendFoo在私有成员Foo更改(或添加另一个成员)时修改类。理想情况下,我想摆脱所有的适配器。有没有办法实现这一目标?

背景:

我想用它来对私有方法进行单元测试,我选择了“朋友”的方式。请不要在这里讨论/批评私有方法的测试,已经有很多关于它的文章了。我只想找到解决所提出的具体技术问题的方法。

Bat*_*eba 5

这是访问类成员的一种合法方式private,它还有一个优点,即您要测试的代码中的源代码污染为零。考虑

class Foo
{
    int bar;
};
Run Code Online (Sandbox Code Playgroud)

然后在您的测试代码中使用

template<typename Y, typename Y::type Member>
struct Penetrator
{
    friend typename Y::type get(Y){
        return Member;
    }
};
Run Code Online (Sandbox Code Playgroud)

为每一个Foo你想阅读的成员定义一个简单的类

struct Foo_bar
{ 
    typedef int Foo::*type;
    friend type get(Foo_bar);
};
Run Code Online (Sandbox Code Playgroud)

和适当的专业:

template struct Penetrator<Foo_bar, &Foo::bar>;
Run Code Online (Sandbox Code Playgroud)

然后你可以写

int main()
{
    Foo f;
    f.*get(Foo_bar()) = 1; // write a value to it.
}
Run Code Online (Sandbox Code Playgroud)