Конструктор в классе с наследованием - PullRequest
1 голос
/ 21 февраля 2010

У меня проблемы с наследованием и конструкторами в 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 ]

5 голосов
/ 21 февраля 2010

В своем коде вы объявляете конструктор Motor (), но никогда не предоставляете реализацию для него. Кроме того, вы, похоже, не используете include guard в ваших заголовочных файлах. motor.h должен выглядеть примерно так (хотя это не связано с проблемой, о которой вы спрашиваете):

#ifndef INC_MOTOR_H
#define INC_MOTOR_H

class Motor
{
   ... // your stuff here
};
#endif

И, наконец, защищенные данные, как правило, плохая идея.

3 голосов
/ 21 февраля 2010

Вы объявили конструктор по умолчанию для класса Motor в Motor.h (Motor(); сразу ниже public:), но вы не дали ему определение в Motor.cpp.

2 голосов
/ 21 февраля 2010

Как уже упоминалось, определение Motor() отсутствует. Самым простым способом было бы изменить его объявление на 'Motor () {}'. Однако этот способ чище:

class Motor {
  protected:
     Motor(float speed, float angle)
      : speed(speed), angle(angle)
     {}

  public: .
}
...
VirtualMotor :: VirtualMotor
  : Motor(2,5)

Так что вам не нужно инициализировать членов базового класса непосредственно из c'or VirtualMotor.

0 голосов
/ 21 февраля 2010

Добавить в motor.cpp

Motor::Motor(){
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...