具有继承的类中的构造方法

时间:2010-02-21 11:59:36

标签: c++ inheritance constructor compiler-errors

我在C ++中遇到了继承和构造函数的问题。我得到的是一个继承VirtualMotor的类Motor(这是正确的说法吗?)。 VirtualMotor类应该有它自己的构造函数,但是当我创建它时,我做错了,编译器给了我一个错误(见下文)。我的源代码是这样的:

Motor.h

class Motor
{
protected:
    float speed;
    float angle;
public:
    Motor();
    float getSpeed();
    float getAngle();
    virtual void setSpeed( float speed );
    virtual void setAngle( float angle );

Motor.cpp

#include "Motor.h"

float Motor::getSpeed() { return speed; }
float Motor::getAngle() { return angle; }

VirtualMotor.h

#include "Motor.h"

class VirtualMotor: public Motor
{
private:
    float lastSpeed;
public:
    VirtualMotor();
    void setSpeed(float speed);
    void setAngle(float angle);
};

VirtualMotor.cpp

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

Main.cpp的

#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()和其他变种而没有任何运气。

4 个答案:

答案 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(){
}