7

将 Visual Studio 2010 C++ 与 googlemock 一起使用。我正在尝试使用我创建的模拟,但出现编译器错误:

EmployeeFake employeeStub;

错误是:

1>c:\someclasstests.cpp(22): error C2512: 'MyNamespace::EmployeeFake' : no appropriate
default constructor available

员工假:

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;
}

我认为问题是基类没有默认构造函数,但我应该如何解决这个问题?我需要向我的基类添加默认构造函数吗?或者我需要在我的模拟类中添加一个构造函数吗?或者是其他东西?

4

2 回答 2

10

您可以在模拟中添加一个构造函数,委托给 Employee 构造函数:

 class MockEmployee : public Employee {
     public:
         MockEmployee(PensionPlan* pension_plan, const char* full_name)
         : Employee(pension_plan, full_name) {}
         // ...
 };

然后像构造 Employee 一样构造 MockEmployee。但是,我强烈建议您对此代码进行一些改进,并且可以简化这一点:

  1. 使 Employee 成为纯虚拟的(使用受保护的默认构造函数)。
  2. 将当前 Employee 实现重命名为描述员工类型的名称(例如 FullTimeEmployee 或 EmployeeWithPensionPlan),并使其继承自纯虚拟类型。
  3. 使用“virtual ~Employee()”而不是“virtual ~Employee(void)”(在参数中显式使用 void 是对 C 的保留,据我所知,在大多数 C++ 社区中已经过时了)。
  4. 使用“const string&”而不是“const char*”作为名称。

因此,为了澄清,我的建议是:

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 ...
};
于 2011-07-06T00:26:51.430 回答
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)是定义。)

于 2011-07-06T00:26:13.127 回答