我有办法通配C ++中的朋友类吗?

时间:2020-08-19 00:45:51

标签: c++ googletest friend

我正在使用gtest对cpp类进行单元测试。考虑一种情况,在这种情况下,我想让测试班级成为实际班级的朋友,以便可以对其私有状态进行单元测试。这对我来说很好。问题在于,在使用非常有用的TEST_P宏(该宏允许您参数化测试实例化)时,框架会稍微改变测试名称。

所以我有类似的东西

class FooTester {
    FooTester() {}
}

TEST_P(FooTester, TestCoolFeature) {
// test my cool feature that needs access to Foo's internal state
}

这很好,但要允许我必须提供

class Foo {
    friend class FooTester_TestCoolFeature;
}

我们可以通过宏魔术看到gtest创建了一个我没有明确声明的新类,它是测试类和测试方法名称的组合。

表面上看不错,但是有点难看。这将要求我为每个需要此访问权限的新测试方法添加一个新的朋友类。唯一的实际问题(如果不可能的话)是,如果gtest更改其实现并以不同的方式处理类名,则可能会破坏我的测试。

是否可以使用某种#define魔术或类似方法将所有FooTester*类声明为friend

1 个答案:

答案 0 :(得分:1)

请勿为此使用friend类。如果您想从Foo访问FooTester,请公开继承:

class FooTester : public Foo
{
    FooTester() {}
}