c++ - 指向这个定义的内部类的静态指针,用于 googletest 的模拟
问题描述
我试图理解为什么生产中的一段代码是按以下方式设计的:为了给人们一些上下文,有一个A类包含一个方法,称为some_method,需要模拟。模拟和所有测试都需要与生产代码隔离。所以我的同事所做的就是通过以下方式在 test 文件夹中重新定义这个类:
class A
{
class mockA
{
public:
mockA()
{
pointer_mockA = this;
}
virtual ~mockA(){
pointer_mockA = NULL;
}
MOCK_METHOD1(some_method, string&(bool x));
static mockA* pointer_mockA;
}
string &some_method(bool x);
}
同样在头文件中,some_method()定义如下:
string& some_method(bool x)
{
return mockA::pointer_mockA->some_method(x);
}
mockA::pointer_A在 cpp 测试文件中被初始化为 NULL。
问题
- pointer_mockA 作为静态指针是否指向类 A 的当前实例?或者只是为什么要使用它?
- 为什么在这个测试头文件中重新定义了A类,而它已经存在于需要测试的代码所在的文件夹中?
- 这种设计很常见吗?没有其他更简单的设计吗?
- 非常感谢对代码的任何其他评论。
解决方案
1. pointer_mockA 指向最后创建的实例或空/nullptr。它在应用程序启动后和每次对 mockA 对象的破坏后都没有指向任何内容。
2. 原因可能是,因为 mockA 是 A 的嵌套类。不幸的是,c++ 不允许这些嵌套类的独立定义。只能在外部类中前向声明一个嵌套类,然后再定义它。
3. 常见吗?我会说不。有一些奇怪的事情:为什么 pointer_mockA 是一个公共字段。为什么会有这个静态指针?宏 MOCK_METHOD1 的定义是什么?成为多态类(虚拟析构函数)重要吗?
推荐阅读
- android - 后退按钮关闭应用程序而不是转到上一个片段 android 导航组件
- excel - 选择项目时更新主目录表中行的日期列
- css - 散景图覆盖其他内容
- jenkins - 更改 Jenkins 用户密码后,Jenkins 节点终止
- java - Java 64 位安装不起作用;只有32位吗?
- python - 查找 Series 值发生显着变化的索引值
- spring-boot - @Autowired 在 Spring Boot 中为 Null,但同样可以通过 Application Context 访问
- javascript - 带有语义 UI 的搜索输入 React OnChange 非常慢
- c++ - 为什么我的编译器将字符串视为 const char[]?
- rust - 是否可以在 Cargo.toml 中指定依赖功能的版本?