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更改(或添加另一个成员)时修改类。理想情况下,我想摆脱所有的适配器。有没有办法实现这一目标?
我想用它来对私有方法进行单元测试,我选择了“朋友”的方式。请不要在这里讨论/批评私有方法的测试,已经有很多关于它的文章了。我只想找到解决所提出的具体技术问题的方法。
这是访问类成员的一种合法方式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)
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |