Alexander Collins
Alexander Collins

Reputation: 192

C++ out-of-line definition Pure Virtual Method

I have 4 files car.cpp, car.h, motorvehicle.h and vehicle.h. I am programming in the QT-creator environment.

The issue i am having is:

error: out-of-line definition of 'getSafetyRating' does not match any declaration in 'vehicle::Car' int Car::getSafetyRating()

Here are the program files for reference, i am new to learning c++ and would really appreciate the help! Cheers Alex. I Apologies in advance for any repost of problems if any.

vehicle.h

#ifndef VEHICLE_H
#define VEHICLE_H

#include <string>

namespace vehicle
{
    class Vehicle
    {
    public:
        Vehicle(int numberOfPassengers,
            int topSpeed,
            int numberOfWheels,
            std::string color = "red");

        virtual ~Vehicle();

        virtual std::string getColor();

        virtual int getTopSpeed();

        virtual int getNumberOfWheels();

        virtual int getNumberOfPassengers();

        virtual int getSafetyRating() = 0;

    protected:
        int m_numberOfPassengers;
        int m_topSpeed;
        int m_numberOfWheels;
        std::string m_color;
    };
}

#endif // VEHICLE_H

motorvehicle.h

#ifndef MOTORVEHICLE_H
#define MOTORVEHICLE_H

#include "vehicle.h"

namespace vehicle
{
    class MotorVehicle : public Vehicle
    {
    public:
        MotorVehicle(int numberOfPassengers,
            int topSpeed,
            int numberOfWheels,
            double kilometresPerLitre);

        MotorVehicle(int numberOfPassengers,
            int topSpeed,
            int numberOfWheels,
            std::string color,
            double kilometresPerLitre);

        virtual ~MotorVehicle();

        virtual double getKilometresPerLitre();

    protected:
        double m_kmpl;
    };
}

#endif // MOTORVEHICLE_H

car.h

#ifndef CAR_H
#define CAR_H

#include "motorvehicle.h"

namespace vehicle
{
    class Car : public MotorVehicle
    {
    public:
        Car(int numberOfPassengers,
            int topSpeed,
            double kilometresPerLitre,
            int numberOfAirBags = 2,
            bool abs = true,
            int numberOfWheels = 4);

        Car(int numberOfPassengers,
            int topSpeed,
            double kilometresPerLitre,
            std::string color,
            int numberOfAirBags = 2,
            bool abs = true,
            int numberOfWheels = 4);

        virtual ~Car();

        virtual int getNumberOfAirBags();

        virtual bool hasAutomaticBreakingSystem();

    protected:
        int m_numberOfAirBags;
        int m_abs;
    };

}

#endif // CAR_H

car.cpp

#include "car.h"
using namespace vehicle;

Car::Car(int numberOfPassengers,
         int topSpeed,
         double kilometresPerLitre,
         int numberOfAirBags,
         bool abs,
         int numberOfWheels) :
    MotorVehicle(numberOfPassengers, topSpeed, numberOfWheels, kilometresPerLitre),
    m_numberOfAirBags(numberOfAirBags),
    m_abs(abs)
{

}
Car::Car(int numberOfPassengers,
         int topSpeed,
         double kilometresPerLitre,
         std::string color,
         int numberOfAirBags,
         bool abs,
         int numberOfWheels):
    MotorVehicle(numberOfPassengers, topSpeed, numberOfWheels,color, kilometresPerLitre),
    m_numberOfAirBags(numberOfAirBags),
    m_abs(abs)
{

}

Car::~Car()
{

}

int Car::getNumberOfAirBags()
{
    return m_numberOfAirBags;
}

bool Car::hasAutomaticBreakingSystem()
{
    return m_abs;
}

int Car::getSafetyRating()
{
    int SafetyRating = 0;
    if (m_numberOfAirBags >= 4)
    {
        SafetyRating += 3;
    }
    else if (m_numberOfAirBags >= 2)
    {
        SafetyRating += 2;
    }
    else if (m_numberOfAirBags > 0)
    {
        SafetyRating += 1;
    }

    if (m_abs)
    {
        SafetyRating += 2;
    }
    return SafetyRating;
}

Upvotes: 0

Views: 1119

Answers (2)

Per-Morten
Per-Morten

Reputation: 81

Your car class does not have a getSafetyRating declared in the .h file, and the pure virtual function in vehicle requires it. When you declare something pure virtual, ie func() = 0, you basically say that any class that inherits from it MUST implement this function. So both the motor vehicle class, and the car class must at the very least declare the getSafetyRating function.

One thing that should solve this is to add this to Motor Vehicle: virtual int getSafetyRating() = 0;

and in the car.h write virtual int getSafetyRating()

Upvotes: 2

Digital_Reality
Digital_Reality

Reputation: 4738

Add declaration of function int getSafetyRating() in your car.h

Upvotes: 0

Related Questions