将Visual Studio 2010 C ++与googlemock一起使用。我正在尝试使用我创建的模拟,我在线上得到编译器错误:
EmployeeFake employeeStub;
错误是:
1>c:\someclasstests.cpp(22): error C2512: 'MyNamespace::EmployeeFake' : no appropriate
default constructor available
EmployeeFake:
class EmployeeFake: public Employee{
public:
MOCK_CONST_METHOD0(GetSalary,
double());
}
员工:
class Employee
{
public:
Employee(PensionPlan *pensionPlan, const char * fullName);
virtual ~Employee(void);
virtual double GetSalary() const;
}
我认为问题是基类没有默认构造函数但是我应该如何解决这个问题呢?我是否需要在基类中添加默认构造函数?或者我是否需要在我的模拟类中添加构造函数?或其他什么?
答案 0 :(得分:9)
您可以向模拟中添加一个构造函数,该构造函数委托给Employee构造函数:
class MockEmployee : public Employee {
public:
MockEmployee(PensionPlan* pension_plan, const char* full_name)
: Employee(pension_plan, full_name) {}
// ...
};
然后构建MockEmployee,就像构建Employee一样。但是,有一些事情可以改进,我强烈推荐这个代码,这将简化这个:
因此,澄清一下,我的建议是:
class Employee {
public:
virtual ~Employee() {}
virtual double GetSalary() const = 0;
protected:
Employee() {}
};
class FullTimeEmployee : public Employee {
// your concrete implementation goes here
};
class MockEmployee : public Employee {
public:
MockEmployee() {}
virtual ~MockEmployee() {}
// ... your mock method goes here ...
};
答案 1 :(得分:2)
你已经提出了一个可能的答案,但让我们拼出一些选择:
1)使基本默认可构造。通过提供默认参数最容易做到:
explicit Employee(PensionPlan *pensionPlan = 0, const char * fullName = "");
(请注意,我们说explicit
是为了避免来自PensionPlan*
的隐性转化。)
2)在派生类的构造函数的基本初始化列表中调用构造函数:
EmployeeFake::EmployeFake() : Employee(0, "") { }
2a)给EmployeeFake
一个合适的构造函数并传递它:
EmployeeFake::EmployeeFake(PensionPlan *p) : Employee(p, "[fake]") { }
(注意(1)是声明,而(2)和(2a)是定义。)