2016-04-05 85 views
1

我的代码有问题。C + + - 错误:没有匹配函数调用'Motor :: Motor()'

我有两个错误:

拳错误:

MotorManager.cpp:7: error: no matching function for call to 'Motor::Motor()'

二错误:

MotorManager.cpp:10: error: use of deleted function 'Motor& Motor::operator=(Motor&&)'

MotorManager.cpp

#include "MotorManager.h" 
#include "Pins.h" 
#include "Direction.h" 
#include "Motor.h" 

MotorManager::MotorManager() { 

    // Init motors 
    _motorLeftFront = Motor(MOTOR_FRONT_LEFT_FORWARD, MOTOR_FRONT_LEFT_BACKWARD); 
    _motorRightFront = Motor(MOTOR_FRONT_RIGHT_FORWARD, MOTOR_FRONT_RIGHT_BACKWARD); 
    _motorLeftBack = Motor(MOTOR_BACK_LEFT_FORWARD, MOTOR_BACK_LEFT_BACKWARD); 
    _motorRightBack = Motor(MOTOR_BACK_RIGHT_FORWARD, MOTOR_BACK_RIGHT_BACKWARD); 
} 

MotorManager.h

#include "Pins.h" 
#include "Direction.h" 
#include "Motor.h" 

class MotorManager { 
public: 

    // Constuctor 
    MotorManager(); 
}; 

Motor.cpp

#include "Motor.h" 
#include "Direction.h" 

Motor::Motor(const int pinForwad, const int pinBackward) : _pinForwad(pinForwad), _pinBackward(pinBackward) { 

    pinMode(pinForwad, OUTPUT); 
    pinMode(pinBackward, OUTPUT); 
} 

Motor.h

#include "Direction.h" 

class Motor { 
public: 

    // Constructor 
    Motor(const int pinForwad, const int pinBackward); 
private: 
//Variables 
int _pinForwad; 
int _pinBackward; 
}; 

由于

+0

'类Motor'不提供默认的构造函数,并为您指定你自己的,编译器不会生成一个给你。 –

回答

1

的主要问题是,你需要使用在构造函数中定义的成员初始化列表,否则MotorManager希望用默认的构造函数初始化它们。

你能解决这个问题是这样的:

MotorManager::MotorManager() 
    : _motorLeftFront(MOTOR_FRONT_LEFT_FORWARD, MOTOR_FRONT_LEFT_BACKWARD) 
    , _motorRightFront(MOTOR_FRONT_RIGHT_FORWARD, MOTOR_FRONT_RIGHT_BACKWARD) 
    , _motorLeftBack(MOTOR_BACK_LEFT_FORWARD, MOTOR_BACK_LEFT_BACKWARD) 
    , _motorRightBack(MOTOR_BACK_RIGHT_FORWARD, MOTOR_BACK_RIGHT_BACKWARD) 
{} 

MotorManager.cpp:10: error: use of deleted function 'Motor& Motor::operator=(Motor&&)' 

那是因为你使用赋值语句

_motorLeftFront = Motor(MOTOR_FRONT_LEFT_FORWARD, MOTOR_FRONT_LEFT_BACKWARD); 

但没有申报的举动赋值运算符是一个跟进的错误过载如:

Motor& Motor::operator=(Motor&&) = default; 

,或者至少拷贝赋值:

Motor& Motor::operator=(const Motor&) = default; 
2

MotorManager实例构造,编译器需要初始化所有它的成员变量的以及。由于成员未在初始化程序列表中初始化,因此会尝试调用该类的默认构造函数。由于Motor没有默认构造函数,因此会出现错误。

这可以通过在初始化列表中初始化成员变量是固定的:

MotorManager::MotorManager() 
: _motorLeftFront(MOTOR_FRONT_LEFT_FORWARD, MOTOR_FRONT_LEFT_BACKWARD), 
    _motorRightFront(MOTOR_FRONT_RIGHT_FORWARD, MOTOR_FRONT_RIGHT_BACKWARD), 
    _motorLeftBackMOTOR_BACK_LEFT_FORWARD, MOTOR_BACK_LEFT_BACKWARD), 
    _motorRightBack(MOTOR_BACK_RIGHT_FORWARD, MOTOR_BACK_RIGHT_BACKWARD) 
{ 
} 
相关问题