我如何通过非恒定引用传递子类

问题描述

我正在为A::some_method()编写一个接受类B的单元测试,如下所示:

class A {
public:
    some_method(B (&obj)[a_big_number]);
} 

班级B(班级不良)的界面很丑:

class B {
public: 
    get_value(int index);
    set_value(int index,value);
}

我不喜欢该界面的原因是get_value(i)set_value(i)映射的元素不同。有人认为,获取值时,对底层数组进行复杂的映射是一个好主意。此映射是由某个第三类C创建和开发的,此处与此无关。

这意味着我要么需要对该无关的映射进行逆向工程以便将测试数据输入到类B中,要么以某种方式绕过它。

要绕过复杂的映射,我想创建一个名为B_Mock的子类,如下所示:

class B_Mock: public B {
public:
    get_value(int index) {/*code that just returns the index referenced by set_value(index)*/}
}

然后在我的单元测试中将其实例化为:

A a;
B_Mock inputs_outputs[1000];
/* code that repeatedly calls set_value() for each element of inputs_outputs with an initial value. */

设置了inputs_outputs之后,我想致电a.some_method(inputs_outputs)来验证some_method()是否正常工作。

这是我的问题:

  • 如果我简单地调用a.some_method(inputs_outputs),则会出现以下编译器错误

    不能使用类型为“ B_Mock [1000]”的值来初始化类型为“ A(&)[1000]”(不是const限定)的引用。

  • 我无法将A::some_method()的界面更改为A::some_method(const B (&obj)[a_big_number]),因为some_method()调用obj[index].set_value()

  • 如果我将A::some_method()的接口更改为A::some_method(const B obj[a_big_number])并按值传递,则编译成功。我不想这样做,因为(1)obj是相当大的大型对象数组,并且(2)在inputs_outputs操作之后,我需要访问a.some_method()中的修改数据在它上面,以验证更新是否正确。按值传递不会返回修改后的对象。

如何以允许我通过B_Mock参数查看修改后的对象的方式将子集A.some_method()传递给inputs_outputs

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)