如何创建构造函数为protected的类的对象?单元测试实例化报错求解
C++单元测试实例化protected构造第三方类解决方案
第一步:修复DbResponseEvent未声明错误
该报错和构造函数权限无关,属于编译阶段未识别类定义,按以下顺序排查:
- 确认引入的头文件包含
DbResponseEvent完整声明,可全局搜索第三方库目录下的DbResponseEvent关键字,匹配到正确的头文件后引入 - 检查头文件引入拼写的大小写,Linux环境下大小写敏感,错误拼写不会直接报头文件不存在,只会触发类未声明错误
- 确认
DbResponseEvent所属的命名空间,使用时补充命名空间前缀,或提前声明using namespace 对应命名空间;,可先尝试用完整限定名实例化验证:库命名空间::DbResponseEvent event;
第二步:解决protected构造函数无法实例化问题
未声明错误修复后,用以下两种常用方案处理权限问题:
方案1:测试代理类继承(无需修改第三方库源码,推荐)
protected成员可被子类访问,在测试代码中定义代理子类,暴露公开构造即可:
// 测试代码中新增,无需改动第三方库 class TestDbResponseEvent : public DbResponseEvent { public: // 透传原构造函数的所有参数即可 TestDbResponseEvent(/* 原构造参数列表 */) : DbResponseEvent(/* 传递参数 */) {} // 若需访问原类其他protected方法,可在此处封装暴露 };
后续直接实例化TestDbResponseEvent类使用,行为和原类完全一致。
方案2:友元声明注入(可修改第三方库源码时使用)
在DbResponseEvent的类定义中新增测试类的友元声明,测试类即可直接访问protected构造:
class DbResponseEvent { protected: DbResponseEvent(); // 新增友元声明,UdrEventHandlerTest为你的测试类名 friend class UdrEventHandlerTest; };
该方案无需修改现有测试的实例化逻辑。
过往尝试无效原因说明
- 类前置声明仅支持声明指针/引用类型,无法用于实例化对象,实例化必须依赖完整类定义
- 继承逻辑颠倒,正确逻辑是测试代理类继承目标类B,而非B继承测试类A
内容的提问来源于stack exchange,提问作者shiv chittora
相关产品推荐
相关产品推荐

