我在C ++中遇到了继承和构造函数的问题。我得到的是一个继承VirtualMotor
的类Motor
(这是正确的说法吗?)。 VirtualMotor类应该有它自己的构造函数,但是当我创建它时,我做错了,编译器给了我一个错误(见下文)。我的源代码是这样的:
class Motor
{
protected:
float speed;
float angle;
public:
Motor();
float getSpeed();
float getAngle();
virtual void setSpeed( float speed );
virtual void setAngle( float angle );
#include "Motor.h"
float Motor::getSpeed() { return speed; }
float Motor::getAngle() { return angle; }
#include "Motor.h"
class VirtualMotor: public Motor
{
private:
float lastSpeed;
public:
VirtualMotor();
void setSpeed(float speed);
void setAngle(float angle);
};
#include "VirtualMotor.h"
VirtualMotor::VirtualMotor()
{
speed = 2;
angle = 5;
}
void VirtualMotor::setSpeed(float speed)
{
this->speed = speed;
}
void VirtualMotor::setAngle(float angle)
{
this->angle = angle;
}
#include <iostream>
#include "VirtualMotor.h"
using namespace std;
int main (int argc, char **argv)
{
VirtualMotor m;
cout << m.getSpeed() << endl;
m.setSpeed(9);
cout << m.getSpeed() << endl;
return 0;
}
要编译我使用命令g++ Main.cpp Motor.cpp VirtualMotor.cpp -o main
,我收到以下错误:
/tmp/ccIdYJaR.o: In function `VirtualMotor::VirtualMotor()':
VirtualMotor.cpp:(.text+0x29): undefined reference to `Motor::Motor()'
/tmp/ccIdYJaR.o: In function `VirtualMotor::VirtualMotor()':
VirtualMotor.cpp:(.text+0x5d): undefined reference to `Motor::Motor()'
/tmp/ccIdYJaR.o:(.rodata._ZTI12VirtualMotor[typeinfo for VirtualMotor]+0x8): undefined reference to `typeinfo for Motor'
collect2: ld returned 1 exit status
我觉得这有一个非常简单的解决方案,但我看不到它。我试图使用VirtualMotor::VirtualMotor() : Motor::Motor()
和其他变种而没有任何运气。
答案 0 :(得分:5)
在您的代码中,您声明了Motor()构造函数,但从未为它提供实现。此外,您似乎没有在头文件中使用包含保护。 motor.h应该看起来像这样(虽然这与你问的问题无关):
#ifndef INC_MOTOR_H
#define INC_MOTOR_H
class Motor
{
... // your stuff here
};
#endif
最后,受保护的数据通常是一个坏主意。
答案 1 :(得分:3)
你已经为Motor.h中的Motor类声明了一个默认构造函数(紧跟Motor();
之后的public:
),但你没有在Motor.cpp中给它一个定义。
答案 2 :(得分:2)
正如其他人所提到的那样,Motor()
的定义缺失了。最简单的方法是将其声明更改为“Motor(){}”。然而,这种方式更清晰:
class Motor {
protected:
Motor(float speed, float angle)
: speed(speed), angle(angle)
{}
public: .
}
...
VirtualMotor :: VirtualMotor
: Motor(2,5)
因此,您不必直接从VirtualMotor
的c'tor内初始化基类成员。
答案 3 :(得分:0)
添加motor.cpp
Motor::Motor(){
}