C++ 在C++;

C++ 在C++;,c++,unit-testing,constructor,mocking,abstract-class,C++,Unit Testing,Constructor,Mocking,Abstract Class,我有一门课看起来有点像这样: class TheClassIWantToTest { public: TheClassIWantToTest(const IInput& input) { setLocalParameter(input.getParameter()); } // other stuff, e.g. setLocalParameter, defined below } 其中输入参数定义为 class IInput { vir

我有一门课看起来有点像这样:

class TheClassIWantToTest {
public:
    TheClassIWantToTest(const IInput& input) {
        setLocalParameter(input.getParameter());
    }
    // other stuff, e.g. setLocalParameter, defined below
}
其中输入参数定义为

class IInput {
    virtual double getParameter() const = 0;
}
我还有一个在我的系统中使用的
IInput
的实现,以及一个用Google Mocks创建的模拟实现

现在,我想做一些事情,比如

MockInput mock; // MockInput : IInput
TheClassIWantToTest sut(mock);
在我的测试中

RealInput theRealStuff; // RealInput : IInput
TheClassIWantToTest(theRealStuff);
但是,当我尝试编译时,我得到的错误是没有定义classsiwanttotest(MockInput)方法。我试图为
IInput
定义一个复制构造函数,该构造函数接受
MockInput
,但是我得到了
错误:隐式声明的IInput(const MockInput&)的定义
,因为我没有在类声明中定义该方法

然而,我宁愿避免在基类定义中声明复制构造函数,因为这意味着在我的生产代码中定义测试方法。(我意识到我可以通过使用
IInput*
指针来解决这个问题,但如果可能的话,我也希望避免这种情况。)


我无法想象我是第一个尝试做到这一点的人,但我还没有找到如何做到这一点。有办法吗?如果是这样的话,你是如何做到的?

试试动态投射:

RealInput theRealStuff; // RealInput : IInput
TheClassIWantToTest(dynamic_cast<const IInput&>(theRealStuff));
realcinput thealstuff;//RealInput:IInput
ClassiwantToTest(动态施法(Theralstaff));

叹息。。。事实证明,我想做的事情一开始确实是可能的。然而,由于一些愚蠢的原因,在这种特定情况下,我的实际类的名称不符合命名约定-您的提示帮助我找到了它不起作用的原因,但是
classsiwanttotest(Theeralstuff)
实际上工作得很好。问题是我上了三节课
B:A
C:A
,并试图将
B
转换为
C
,而不是转换为
A
,因为
B
有一个名称,使我认为它是
A
。澄清一下:问题是构造函数被定义为
ClassisWantToTest(const RealInput&input)
而不是我在问题中指定的内容。将其更改为
IInput
我最初尝试的一切都“正常”(TM)。